为什么Math.Round(0.125,2)舍入到0.12?
Dim foo As Decimal
foo = Math.Round(0.125, 2)
Run Code Online (Sandbox Code Playgroud)
foo现在是0.12但它应该是0.13
我听说这是因为.Net中的某些标准是最接近的偶数,但这只是糟糕的数学.12.5将向下舍入到12,但13.5将向上舍入到14.有没有办法解决这个问题?
p.s*_*w.g 10
从文件的Math.Round(decimal)方法:
如果d的小数分量在两个整数之间,其中一个是偶数而另一个是奇数,则返回偶数.
相同的逻辑适用于Math.Round(decimal, int)过载.注意:
Math.Round(0.125, 2) // 0.12
Math.Round(0.135, 2) // 0.14
Math.Round(0.145, 2) // 0.14
Run Code Online (Sandbox Code Playgroud)
这不是'糟糕的数学'; 这是一种常见的舍入策略,称为"从圆到偶".来自维基百科:
圆形到最近方法的这种变体也称为无偏舍入,收敛舍入,统计学舍入,荷兰舍入,高斯舍入,奇偶舍入,银行家舍入或破碎舍入,并且广泛用于簿记.
这是IEEE 754计算功能和运算符中使用的默认舍入模式.
如果想要更好地控制它的舍入方式,可以指定一个MidpointRounding参数
Math.Round(0.125, 2, MidpointRounding.AwayFromZero) // 0.13
Run Code Online (Sandbox Code Playgroud)