.net Net为什么要将第5轮四舍五入到最接近的偶数,对此我能做些什么?

.net Net为什么要将第5轮四舍五入到最接近的偶数,对此我能做些什么?,.net,vb.net,.net,Vb.net,为什么数学是四舍五入(0.125,2)四舍五入到0.12 Dim foo As Decimal foo = Math.Round(0.125, 2) foo现在是0.12,但应该是b0.13 我听说这是因为.Net中的一些标准将舍入到最近的偶数,但这只是糟糕的数学。12.5将四舍五入为12,但13.5将四舍五入为14。有没有办法解决这个问题?从Math.Round(decimal)方法: 如果d的分数部分位于两个整数的中间,其中一个是偶数,另一个是奇数,则返回偶数 同样的逻辑也适用于Math.

为什么数学是四舍五入(0.125,2)四舍五入到0.12

Dim foo As Decimal
foo = Math.Round(0.125, 2)
foo现在是0.12,但应该是b0.13

我听说这是因为.Net中的一些标准将舍入到最近的偶数,但这只是糟糕的数学。12.5将四舍五入为12,但13.5将四舍五入为14。有没有办法解决这个问题?

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
这不是“糟糕的数学”;这是一种常见的四舍五入策略,称为“从四舍五入到五舍五入”。发件人:

这种四舍五入至最近法的变体也称为无偏四舍五入、收敛四舍五入、统计学家四舍五入、荷兰四舍五入、高斯四舍五入、奇偶四舍五入,银行舍位破舍位,广泛用于记账

这是IEEE 754计算函数和运算符中使用的默认舍入模式

如果您想更好地控制它的取整方式,可以指定
中点取整
参数

Math.Round(0.125, 2, MidpointRounding.AwayFromZero) // 0.13

仅供参考,这被称为“银行取整”。这是银行取整。使用接受中点舍入参数的Round()重载对其进行更改。啊,中点舍入。AwayFromZero就可以做到这一点。我每天都学到新东西。谢谢