当前位置 : 主页 > 编程语言 > c语言 >

VB6中的浮点比较

来源:互联网 收集:自由互联 发布时间:2021-06-24
在VB6中测试两个单打是否相同的最佳方法是什么? 我想测试两个单值相等到7个有效数字. This MSDN article建议使用类似的东西 If Abs(a - b) = Abs(a / 10 ^ 7) Then valuesEqual = TrueEnd If 但是,某些值可
在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

有没有更好的方法?

我维护一个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)

负数位于左侧正数的小数点右侧.

网友评论