使用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