首页 > 解决方案 > 比较两个双打是否相等失败

问题描述

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

我有一个 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

Vol并且USVol是全局定义的变体。Vol = 0.125. USVol = 0.85.

0.85 * 0.125 = 0.10625

我希望TBC = temp_gif 语句会触发,并且ContinueCalculation = False语句会被触发。相反,代码符合TBC > temp_g条件并且代码停止。

知道为什么会发生这种情况吗?

标签: excelvbaif-statementdouble

解决方案


问题

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

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

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

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

阅读比较浮点数浮点运算可能会在 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


推荐阅读