当分割并乘以相同的数字时,表达式上的Math.Ceiling()

时间:2015-08-10 15:20:53

标签: c# multiplication divide

我在 C#中的 Math.Ceiling()有点麻烦。

我用分号的结果称它为数字,然后乘以相同的数字,例如20 000/184 * 184。我希望结果是20 000,但它是20 001.在尝试向上计算价值时,有什么方法可以避免这种行为吗?

提前谢谢

3 个答案:

答案 0 :(得分:2)

运行您提供的代码时,我们有以下

twentyThousand/oneEightyFour * oneEightyFour

答案是20000.000000000000000000000001

因此,当你做上限时我们有20001

通过以下文章,我认为结果是由于在执行除法时引入的不准确性,这会产生108.69565217391304347826086957并且如Jon所说

  

作为一个非常宽泛的经验法则,如果你最终看到很长的字符串表示(即大多数28/29数字都不为零),那么你可能会遇到一些不准确的问题。

http://csharpindepth.com/Articles/General/Decimal.aspx

答案 1 :(得分:1)

正如评论中指出的那样,你根本不应该得到20001。

20000/184将产生108.然后,当乘以184时,它会给你19872。

在某个地方,你正在做的事情不同于你发布的内容。 Math.Ceiling()甚至在哪里调用?

我会说,如果这些数字是硬编码的,你可以在代码中加一个小数,它就会这样对待它。如果使用表示数字的变量,请确保它们被格式化为某种浮点类型(十进制,双精度,浮点数),具体取决于所需的精度。

Console.WriteLine(20000 / 184 * 184);  // 19872
Console.WriteLine((20000.0 / 184.0 * 184.0));  // 20000

答案 2 :(得分:0)

  

在尝试舍入值时,有什么方法可以避免这种行为吗?

在这种特殊情况下,您可以先通过乘以然后划分来避免此问题:

result = (20000m * 184m) / 184m ;

由于分割中的精度会丢失,所以乘以第一个可以防止在你乘法时夸大这种不精确的形式。