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。
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。
主要问题是在float
anddouble
中,小数位数不是值的一部分,精度不是decimal,而是binary。并且没有可以1.225
精确表示的有限二进制数。
因此,当您这样做时Math.Round(1.225f, 2)
,您实际上是在做类似Math.Round(1.22500002f, 2)
的事情-不涉及中点舍入。
出现同样的问题Math.Round(2.225f, 2)
- 只是“真实”值略小于,2.225f
因此结果向下舍入。但是仍然不涉及中点舍入。
如果您需要小数精度,请使用decimal
. 既不float
是也不double
是为十进制精度而设计的——它们适用于物理计算,但不适用于会计。
1.225
不能用浮点数精确表示,所以你真的是四舍五入1.225000023841858
。