VB.Net为什么Math.Round在第5轮到最近的偶数,我该怎么办呢?

BCl*_*don 6 .net vb.net

为什么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)