Math.Round(1.225,2)给出1.23,不应该给出1.22

时间:2016-01-15 12:48:16

标签: c# .net rounding bankers-rounding

AFAIK .NET的默认舍入选项是偶数,因此Math.Round(1.225,2)应该提供 1.22 ,但它提供 1.23

Math.Round(2.225,2) = 2.22 
Math.Round(100.225,2) = 100.22 

我尝试的所有值都舍入到最接近的值,但只有 1.225 -1.225 舍入到 1.23 -1.23

2 个答案:

答案 0 :(得分:7)

主要问题是在floatdouble中,小数位数不是值的一部分,精度不是十进制,而是二进制。并且没有可以完全代表1.225的有限二进制数。

因此,当您执行Math.Round(1.225f, 2)时,您实际上正在做更像Math.Round(1.22500002f, 2)的事情 - 没有涉及中点舍入。

同样的问题出现在Math.Round(2.225f, 2) - 它只是"真实"值略微而不是2.225f,因此结果向下舍入。但是仍然没有涉及中点四舍五入。

如果需要小数精度,请使用decimalfloatdouble都不是针对小数精度设计的 - 它们可以用于例如物理计算,但不是例如计费。

答案 1 :(得分:2)

1.225无法完全以浮点表示,因此您实际上是四舍五入1.225000023841858