3

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

4

2 回答 2

7

主要问题是在floatanddouble中,小数位数不是值的一部分,精度不是decimal,而是binary。并且没有可以1.225精确表示的有限二进制数。

因此,当您这样做时Math.Round(1.225f, 2),您实际上是在做类似Math.Round(1.22500002f, 2)的事情-不涉及中点舍入。

出现同样的问题Math.Round(2.225f, 2)- 只是“真实”值略小于2.225f因此结果向下舍入。但是仍然不涉及中点舍入。

如果您需要小数精度,请使用decimal. 既不float是也不double是为十进制精度而设计的——它们适用于物理计算,但不适用于会计。

于 2016-01-15T13:15:12.843 回答
2

1.225不能用浮点数精确表示,所以你真的是四舍五入1.225000023841858

于 2016-01-15T13:19:07.163 回答