比较两个双打是否相等

时间:2018-11-12 15:46:06

标签: excel vba excel-vba if-statement double

这很奇怪,我没有一个最小的示例显示它,因为它位于大量代码的中间,并且我无法在示例代码中复制它。

我有一个if语句:

    Dim TBC as Double: TBC = 0.10625
    Dim temp_g As Double: temp_g = Vol * USVol
    If TBC = temp_g Then
        ContinueCalculation = False
    ElseIf TBC > temp_g Then
        Stop 'you have an error.
    End If

VolUSVol是全局定义的变体。 Vol = 0.125USVol = 0.85

0.85 * 0.125 = 0.10625

我希望TBC = temp_g if语句会触发,并且会触发ContinueCalculation = False语句。相反,代码达到了TBC > temp_g条件,代码停止了。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

问题

这里的问题是技术性的。计算机不能真正执行代数计算,而是可以以定义的精度执行数值计算。这意味着结果在数学上可能不正确,但相当接近正确。

因此,您无法比较浮点值是否相等。

计算机中的值不是100%精确的。它们仅精确到特定位数。例如:

Number       Value
0.1          0.1 (of course)
float(.1)    0.100000001490116119384765625
double(.1)   0.1000000000000000055511151231257827021181583404541015625 

阅读Comparing floating point numbersFloating-point arithmetic may give inaccurate results in Excel了解更多背景信息以及如何正确处理这些信息。


解决方案1 ​​

因此,不是测试相等性If TBC = temp_g Then,而是检查它们的差是否小于满足您为使这两个相等而制定的精确度标准的“小数” 10⁻ⁿ

例如,您可以使用以下内容(其中n是精确到等于数字所需的位数):

If (TBC - temp_g) ^ 2 < (10 ^ -n) ^ 2 Then

请注意,我们需要将两边均等以确保没有负面结果。


解决方案2

或者,您也可以将两个值四舍五入到特定位数以测试是否相等。

If Round(TBC, 5) = Round(temp_g, 5) Then

如果前5位数字相同,这将认为TBC等于temp_g