1

我正在尝试使用我在本论坛其他地方找到的这个方便的代码在电子表格中使用 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

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

4

1 回答 1

3

舍入算法在处理“中间”情况的方式上有所不同。有关更多信息,请参阅 Wikipedia 讨论。

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

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

我相信它不这样做的原因可能是由于 MS VBA 如何处理无法完全按照 IEEE 规范表示的十进制值。最有可能的是,内部存储的值的十进制表示类似于1233.71499999...

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

例如:

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

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

vbaRound函数使用 Double 数据类型

在此处输入图像描述

于 2020-05-13T12:08:28.087 回答