2

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

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

用户分别在输入单元格中输入 120.3 和 120。lInterval 的值为 10。VBA 为 lLines 生成 2,而不是 3。

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

4

3 回答 3

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

于 2013-03-22T14:09:09.960 回答
3

请在使用小数时使用单精度或双精度以获得更准确的结果。

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

输出 = 3

在此处输入图像描述

于 2013-03-22T14:27:32.100 回答
0

这是 Excel 中已知的浮点问题

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

来自 MSDN:

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

=圆形(1*(0.5-0.4-0.1),2)

在您的情况下,使用 round() 而不是 INT 应该使用 0 而不是 2 来解决问题

于 2013-03-22T15:05:06.080 回答