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




