我注意到,当我调用Math.Round并为其提供十进制值-0.375并尝试将其四舍五入到两位小数时,它会将值四舍五入为-0.38.我总是被教导,5或更大的意思是向上舍入,这意味着它应该是-0.37.舍入到-0.37是Javascript如何做到这一点,这就是我发现这个问题的方法.
这是一些示例代码.
decimal negNumber = -0.375m;
var resultToEven = Math.Round(negNumber, 2, MidpointRounding.ToEven);
var resultAwayFromZero = Math.Round(negNumber, 2, MidpointRounding.AwayFromZero);
Console.WriteLine("Original Number: " + negNumber);
Console.WriteLine("ToEven: " + resultToEven);
Console.WriteLine("Away from zero: " + resultAwayFromZero);
Run Code Online (Sandbox Code Playgroud)
这是它输出的内容.
原始编号:-0.375
ToEven:-0.38
远离零:-0.38
我使用的是.NET 4.0.
Math.Round中的默认行为是使用MidpointRounding.ToEven,它向"最接近的偶数" 舍入.
如果数字位置的数字是奇数,则将其更改为偶数.否则,它保持不变.此行为遵循IEEE标准754第4节.有时称为舍入到最近,或者是银行家的舍入.它最大限度地减少了在单个方向上始终舍入中点值所导致的舍入误差.
您的第二个电话使用AwayFromZero,它明确地舍入:
朝着最接近零的数字
在您的情况下,-0.38比0.0更远离-0.37.