2008-10-24 103 views
8

我有麻煩比較2雙在Excel VBA雙比較VBA精度問題

假設我有以下代碼

Dim a as double 
Dim b as double 
a = 0.15 
b = 0.01 

b上的幾個操作後,B現在等於0.6

但有關雙數據類型不精確讓我頭疼,因爲

if a = b then 
//this will never trigger 
end if 

你知道我怎樣才能消除雙重類型的尾隨不精確?

回答

13

您無法比較浮點值是否相等。有關如何處理內在錯誤的討論,請參閱本文「Comparing floating point numbers」。

它不像一個恆定的誤差範圍那麼簡單,除非你確切地知道浮動的絕對範圍是什麼。

+1

對於另一參考你可以檢查出http://msdn.microsoft.com/en-us/ library/ae382yt8(VS.80).aspx – ZCHudson 2008-10-24 22:14:48

3

比較雙等於平等是永遠不明智的。

一些十進制值映射到幾個浮點表示。所以一個0.6並不總是等於另一個0.6。

如果我們從另一箇中減去一個,我們可能得到類似於0.00000000051的東西。

我們現在可以將相等定義爲具有小於某個誤差範圍的差異。

1

正如已經指出的,很多十進制數不能精確地表示爲傳統的浮點類型。根據問題空間的性質,最好使用十進制VBA類型,該類型可以表示十進制數(基數爲10),其精度可以達到某個小數點。這通常用於代表金錢,例如,通常需要2位小數精度。

Dim a as Decimal 
Dim b as Decimal 
a = 0.15 
b = 0.01 
+0

vba中有十進制數嗎?我認爲你需要聲明爲variant,然後通過Cdec(myVar)轉換爲十進制。 – 2008-10-25 16:26:47

1

貨幣數據類型可以是一個很好的選擇。它以固定的四位數精度處理相對較大的數字。

3

,如果你要做到這一點....

Dim a as double 
Dim b as double 
a = 0.15 
b = 0.01 

您需要添加輪函數在IF語句是這樣的...

If Round(a,2) = Round(b,2) Then 
    //code inside block will now trigger. 
    End If 

參見here for additional Microsoft reference

2

下面是一個簡單的功能,我寫道:

Function dblCheckTheSame(number1 As Double, number2 As Double, Optional Digits As Integer = 12) As Boolean 

If (number1 - number2)^2 < (10^-Digits)^2 Then 
    dblCheckTheSame = True 
Else 
    dblCheckTheSame = False 
End If 

End Function 

與調用它:

MsgBox dblCheckTheSame(1.2345, 1.23456789) 
MsgBox dblCheckTheSame(1.2345, 1.23456789, 4) 
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002) 
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002, 14)