You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA Round函数结果与Excel公式不一致问题求助

为什么VBA的Round结果和Excel公式不一样?

这是个非常常见的VBA与Excel工作表函数的差异问题,核心原因有两个:

1. 舍入规则不同

  • Excel工作表的ROUND函数用的是传统四舍五入规则:只要舍去部分的第一位数字≥5,就向保留位进1。所以对于152.575,第三位小数是5,直接进一位得到152.58。
  • VBA内置的Round函数采用的是银行家舍入法(四舍六入五成双):这是一种更公平的统计舍入方式,当舍去位是5且后续没有非零数字时,会看保留位的最后一位:如果是偶数就舍去,是奇数就进1。不过这里还有个隐藏的坑——

2. 浮点数精度问题

152.575这个十进制数在二进制浮点数中无法精确存储,实际存入Excel单元格的数值可能是略小于152.575的近似值(比如152.57499999999998)。当VBA读取这个值后,用内置Round处理时,会把它当成小于152.575的数,自然就舍去得到152.57了。

解决方法

方法一:直接调用Excel工作表的ROUND函数

在VBA里使用WorksheetFunction.Round来替代内置的Round,这样就能和单元格公式的结果完全一致:

Dim n As Double
n = Cells(1, "A").Value
n = WorksheetFunction.Round(n, 2)

方法二:自定义传统四舍五入函数

如果不想依赖工作表函数,可以自己写一个实现传统四舍五入的函数,避免浮点数精度影响:

Function TraditionalRound(ByVal num As Double, ByVal decimals As Integer) As Double
    Dim scale As Double
    scale = 10 ^ decimals
    ' 加上极小值避免浮点数精度问题
    TraditionalRound = Int(num * scale + 0.5000001) / scale
End Function

然后调用它:

Dim n As Double
n = Cells(1, "A").Value
n = TraditionalRound(n, 2)

内容的提问来源于stack exchange,提问作者Mick

火山引擎 最新活动