我在 C#中的 Math.Ceiling()有点麻烦。
我用分号的结果称它为数字,然后乘以相同的数字,例如20 000/184 * 184。我希望结果是20 000,但它是20 001.在尝试向上计算价值时,有什么方法可以避免这种行为吗?
提前谢谢
答案 0 :(得分:2)
运行您提供的代码时,我们有以下
twentyThousand/oneEightyFour * oneEightyFour
答案是20000.000000000000000000000001
因此,当你做上限时我们有20001
。
通过以下文章,我认为结果是由于在执行除法时引入的不准确性,这会产生108.69565217391304347826086957
并且如Jon所说
作为一个非常宽泛的经验法则,如果你最终看到很长的字符串表示(即大多数28/29数字都不为零),那么你可能会遇到一些不准确的问题。
答案 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 ;
由于分割中的精度会丢失,所以乘以第一个可以防止在你乘法时夸大这种不精确的形式。