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 。
答案 0 :(得分:7)
主要问题是在float
和double
中,小数位数不是值的一部分,精度不是十进制,而是二进制。并且没有可以完全代表1.225
的有限二进制数。
因此,当您执行Math.Round(1.225f, 2)
时,您实际上正在做更像Math.Round(1.22500002f, 2)
的事情 - 没有涉及中点舍入。
同样的问题出现在Math.Round(2.225f, 2)
- 它只是"真实"值略微小而不是2.225f
,因此结果向下舍入。但是仍然没有涉及中点四舍五入。
如果需要小数精度,请使用decimal
。 float
和double
都不是针对小数精度设计的 - 它们可以用于例如物理计算,但不是例如计费。
答案 1 :(得分:2)
1.225
无法完全以浮点表示,因此您实际上是四舍五入1.225000023841858
。