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

use*_*178 3 .net c# bankers-rounding 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 
Run Code Online (Sandbox Code Playgroud)

我试过的所有值都是最接近的,但只有1.225-1.225回合到1.23-1.23.

Lua*_*aan 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是为十进制精度而设计的 - 它们适用于例如物理计算,但不适用于例如会计.