我有麻煩比較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
你知道我怎樣才能消除雙重類型的尾隨不精確?
我有麻煩比較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
你知道我怎樣才能消除雙重類型的尾隨不精確?
您無法比較浮點值是否相等。有關如何處理內在錯誤的討論,請參閱本文「Comparing floating point numbers」。
它不像一個恆定的誤差範圍那麼簡單,除非你確切地知道浮動的絕對範圍是什麼。
比較雙等於平等是永遠不明智的。
一些十進制值映射到幾個浮點表示。所以一個0.6並不總是等於另一個0.6。
如果我們從另一箇中減去一個,我們可能得到類似於0.00000000051的東西。
我們現在可以將相等定義爲具有小於某個誤差範圍的差異。
正如已經指出的,很多十進制數不能精確地表示爲傳統的浮點類型。根據問題空間的性質,最好使用十進制VBA類型,該類型可以表示十進制數(基數爲10),其精度可以達到某個小數點。這通常用於代表金錢,例如,通常需要2位小數精度。
Dim a as Decimal
Dim b as Decimal
a = 0.15
b = 0.01
vba中有十進制數嗎?我認爲你需要聲明爲variant,然後通過Cdec(myVar)轉換爲十進制。 – 2008-10-25 16:26:47
貨幣數據類型可以是一個很好的選擇。它以固定的四位數精度處理相對較大的數字。
,如果你要做到這一點....
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
下面是一個簡單的功能,我寫道:
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)
對於另一參考你可以檢查出http://msdn.microsoft.com/en-us/ library/ae382yt8(VS.80).aspx – ZCHudson 2008-10-24 22:14:48