Math.Ceiling()在除以和乘以相同数字时的表达式

本文关键字:数字 表达式 Ceiling Math | 更新日期: 2023-09-27 18:07:14

我在 c# 中使用Math.Ceiling()遇到了一点麻烦。

我在除一个数字之后再乘一个相同数字的结果上调用它,例如20000/184 * 184。我希望这个结果是20000,但它是200001。当尝试四舍五入值时,是否有任何可能的方法来避免这种行为?

提前感谢

Math.Ceiling()在除以和乘以相同数字时的表达式

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

twentyThousand/oneEightyFour * oneEightyFour

答案是20000.000000000000000000000001

因此,当你做天花板时,我们有20001

在接下来的文章中,我认为结果是由于在执行除法时引入的不准确性,这产生了108.69565217391304347826086957和Jon所说的

作为一个非常广泛的经验法则,如果你最终看到一个很长的字符串表示(即大多数28/29位数字不是零),那么很可能你在这个过程中有一些不准确。

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

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

20000/184将产生108。那就是19872乘以184。

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

我会说,如果数字是硬编码的,你可以在代码中放一个小数,它就会这样对待它。如果您正在使用表示数字的变量,请确保根据所需的精度将它们格式化为某种浮点类型(decimal、double、float)。

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

在尝试四舍五入值时是否有任何可能的方法来避免这种行为?

在这种特殊情况下,您可以通过先乘然后除以来避免这个问题。

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

由于除法时失去了精度,因此先乘可以防止在相乘时不精确的形式被夸大。