为什么 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 数据类型
我正在尝试使用电子表格中的 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 数据类型