使用INTfunction时舍入错误

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

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

用户分别input120.3和120到input单元中。 lInterval的值为10. VBA为lLines生成2的结果,而不是3。

我可以通过将0.000000001添加到dRangeUpper来解决此问题,但是我想知道是否有这种行为的已知原因?

这似乎是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

使用小数点时,请使用单倍或双倍来获得更准确的结果。

 Sub sample() Dim dRangeUpper As Double dRangeUpper = CDbl("120.3") - CDbl("120") lLines = Round(CDbl(dRangeUpper * 100 / 10), 4) End Sub 

输出= 3

在这里输入图像描述

这是Excel中已知的浮点问题

http://support.microsoft.com/kb/78113

来自MSDN:

要最大限度地减less浮点运算存储不准确的影响,请使用Round()函数将数字四舍五入到您的计算所需的小数位数。 例如,如果您使用的是货币,则可能会舍入到小数点后两位:

= ROUND(1 *(0.5-0.4-0.1),2)

在你的情况下,使用round()而不是INT应该使用0来代替2