代码之家  ›  专栏  ›  技术社区  ›  roomaroo

vb6中的浮点比较

  •  3
  • roomaroo  · 技术社区  · 14 年前

    在vb6中测试两个单曲是否相等的最佳方法是什么?

    我想测试两个单值是否等于7个有效数字。

    This MSDN article 建议使用类似

    If Abs(a - b) <= Abs(a / 10 ^ 7) Then
        valuesEqual = True
    End If
    

    但是,对于某些值,这可能会失败,例如

    Public Sub Main()
    
        Dim a As Single
        Dim b As Single
    
        a = 0.50000005
        b = 0.50000014
    
        Debug.Print "a = " & a
        Debug.Print "b = " & b
        Debug.Print "a = b: " & (a = b)
        Debug.Print "SinglesAreEqual(a, b): " & SinglesAreEqual(a, b)
    
        // Output:
        // a = 0.5000001
        // b = 0.5000001
        // b = b: False
        // SinglesAreEqual(a, b): False
    
    End Sub
    
    Private Function SinglesAreEqual(a As Single, b As Single) As Boolean
    
        If Abs(a - b) <= Abs(a / 10 ^ 7) Then
            SinglesAreEqual = True
        Else
            SinglesAreEqual = False
        End If
    
    End Function
    

    我发现获得我需要的结果的最简单方法是将值转换为字符串,但看起来非常难看:

    Private Function SinglesAreEqual(a As Single, b As Single) As Boolean
    
        SinglesAreEqual = (Str$(a) = Str$(b))
    
    End Function
    

    有更好的方法吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   RS Conley    14 年前

    我维护一个CAD/CAM应用程序,我必须一直处理浮点数。我有一个函数称为fcomp,当需要测试相等性时,它会传递一个浮点值。fcomp调用一个舍入函数集来达到一定的精度。对于我们的系统,我四舍五入到小数点后6位。你的可能需要更高或更低,这取决于应用程序。

    fcomp函数存在,因此我有一个点可以更改这些计算中使用的舍入系数。几年前,当我们开始制造更高精度的机器时,这证明是很方便的。

    Public Function pRound(ByVal Value As Double, ByVal Power As Double) As Double
        Dim TempValue As Double
        Dim tSign As Double
        TempValue = Value
        tSign = TempValue
        TempValue = Abs(TempValue)
        TempValue = TempValue * 10 ^ (Power * -1)
        TempValue = Fix(TempValue + 0.5)
        TempValue = TempValue / 10 ^ (Power * -1)
        pRound = TempValue * Sign(tSign)
    End Function
    

    四舍五入到小数点后6位

    roundedNumber=Pround(myValue,-6)

    负数是小数点的右边,正数是左边。

        2
  •  2
  •   bugtussle    14 年前

    相反,如果进行四舍五入并测试是否相等,则可以取两个数字的差并将其与一个因子进行比较。

    If Abs(a - b) < 0.000001 Then

    你可以调整 0.000001 无论你需要什么样的决心

        3
  •  2
  •   jbobbins    14 年前

    我不相信你能用 single 数据类型为多个有效数字。你需要使用 double 相反:

    Dim a As Single
    Dim s As String
    
    s = "0.50000005"
    a =  0.50000005
    
    Debug.Print s & " " & a
    

    以上输出:

    0.50000005
    0.5000001