在VB6中测试两个单曲是否相同的最佳方法是什么?
我想测试两个Single值是否相等到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
有没有更好的方法?
答案 0 :(得分:3)
我维护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)
负数位于左侧小数点右侧。
答案 1 :(得分:2)
相反,如果舍入并测试相等性,则可以取两个数字的差值并将其与因子进行比较
If Abs(a - b) < 0.000001 Then
您可以将0.000001
调整为您需要的任何分辨率
答案 2 :(得分:2)
我不相信您可以将single
数据类型用于那么多有效数字。您需要使用double
代替:
Dim a As Single
Dim s As String
s = "0.50000005"
a = 0.50000005
Debug.Print s & " " & a
以上输出:
0.50000005
0.5000001