使用INT功能时出现舍入错误

时间:2013-03-22 13:45:42

标签: excel excel-vba vba

我在两个单元格中有用户输入,名为“UpperRangeHigh”和“UpperRangeLow”。我有以下代码:

dRangeUpper = [UpperRangeHigh] - [UpperRangeLow]
lLines = Int(dRangeUpper * 100 / lInterval)

用户分别将120.3和120输入到输入单元中。 lInterval的值为10.对于lLines,VBA产生的结果为2,而不是3。

我可以通过向dRangeUpper添加0.000000001来解决这个问题,但我想知道是否存在这种行为的已知原因?

3 个答案:

答案 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

enter image description here

答案 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