在VB6中測試兩個單方相等的最佳方式是什麼?在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
有什麼更好的辦法?
我覺得這裏的主要問題是認爲單持有十進制數據。這使得諸如「7位有效數字」的概念受到轉換和近似誤差的影響。在執行您引用的比較計算之前,您可以嘗試將它們轉換爲Double值。 – Bob77 2010-09-07 16:03:55
Bob - a Single是4字節的浮點值,Double是8字節的浮點數,所以有意義的數字是相關的。十進制數據保存在十進制數據類型中。 – roomaroo 2010-09-08 11:48:30
否Variant的「Decimal」子類型與Currency相同,是一個縮放的二進制整數。你的「7位數字」是「7位十進制數字」,並且由於Single保存二進制數據,這就是錯誤蔓延的地方。也許看看http://msdn.microsoft.com/en-us/library/aa164504(office.10) ).aspx爲了一些清晰? 「7位數字」正在推動Single的準確性限制。 – Bob77 2010-09-10 04:14:42