我在两个单元格中有用户输入,名为“UpperRangeHigh”和“UpperRangeLow”。我有以下代码:
dRangeUpper = [UpperRangeHigh] - [UpperRangeLow]
lLines = Int(dRangeUpper * 100 / lInterval)
用户分别将120.3和120输入到输入单元中。 lInterval的值为10.对于lLines,VBA产生的结果为2,而不是3。
我可以通过向dRangeUpper添加0.000000001来解决这个问题,但我想知道是否存在这种行为的已知原因?
答案 0 :(得分:4)
这似乎是Excel的计算和有效数字的问题。如果你这样做:
=120.3 - 120
并格式化单元格以显示15位小数,结果显示为:
0.2999999999999970
这是一个简短的概述,它解释了Excel如何使用二进制算法,这可能会导致结果与您的预期不同:
http://excel.tips.net/T008143_Avoiding_Rounding_Errors_in_Formula_Results.html
你可以通过强制舍入精度来克服这个问题,例如,到10位小数:
lLines = Int(Round(dRangeUpper, 10) * 100 / lInterval
答案 1 :(得分:3)
使用小数时,请使用单个或双精度来获得更准确的结果。
Sub sample()
Dim dRangeUpper As Double
dRangeUpper = CDbl("120.3") - CDbl("120")
lLines = Round(CDbl(dRangeUpper * 100 / 10), 4)
End Sub
输出= 3
答案 2 :(得分:0)
这是Excel中已知的浮点问题
http://support.microsoft.com/kb/78113
来自MSDN:
最小化浮点运算存储的任何影响 不准确,使用Round()函数将数字舍入到数字 计算所需的小数位数。例如,如果 你正在使用货币,你可能会舍入到小数点后2位 地方:
= ROUND(1 *(0.5-0.4-0.1),2)
在你的情况下,使用round()而不是INT应该使用0而不是2