为什么 Excel VBA 中的 Bankers Rounding 函数会根据小数位数给出不同的结果?

Why does Bankers Rounding function in Excel VBA give different results depending on number of decimal places?

我正在尝试使用电子表格中的 VBA Round() 函数,使用我在本论坛其他地方找到的这个方便的代码:

Function BankerRound(rng As Double, sig As Integer) As Double
    BankerRound = Round(rng, sig)
End Function

但我对这些结果感到惊讶(全部使用 2 位小数)

1233.71537501667 rounds to 1233.72
1233.715 rounds to 1233.71

有人可以解释为什么结果不同吗?

舍入算法在处理“中间”情况的方式上有所不同。有关详细信息,请参阅维基百科讨论。

关于所谓的 Bankers Rounding(我认为银行家不会使用它),该算法要求四舍五入到最接近的偶数。

因此,您的特定示例 1233.715 应四舍五入为 1233.72,与 123.715 四舍五入为 123.72 的方式大致相同。

我认为它不存在的原因可能是由于 MS VBA 处理无法完全按照 IEEE 规范表示的十进制值的方式。最有可能的是,内部存储的值的十进制表示类似于 1233.71499999...

如果这很重要,您应该能够通过使用十进制数据类型获得所需的值,这些值存储为整数而不是浮点二进制。

例如:

Function bankerRound(num As Variant, numDecimals As Long)
    bankerRound = Round(CDec(num), numDecimals)
End Function

为了进一步清楚(?混淆?)检查以下结果:

vbaRound 函数使用 Double 数据类型