Vergleichen Sie doppelt in VBA Präzision Problem
-
04-07-2019 - |
Frage
Ich habe Probleme zu vergleichen 2 Doppel in Excel VBA
annehmen, dass ich den folgenden Code haben
Dim a as double
Dim b as double
a = 0.15
b = 0.01
Nach einigen Manipulationen an b, b ist nun gleich 0,6
aber die Ungenauigkeit des doppelten Datentyp im Zusammenhang gibt mir Kopfschmerzen, weil
if a = b then
//this will never trigger
end if
Weißt du, wie ich die Hinter Unschärfen auf dem Doppeltyp entfernen?
Lösung
Sie können Punktwerte für schwebende Gleichheit nicht vergleichen. Lesen Sie diesen Artikel auf „ Gleitkommazahlen Vergleich “für eine Diskussion darüber, wie die Eigenfehler zu behandeln.
Es ist nicht so einfach wie auf eine konstante Fehlerspanne zu vergleichen, wenn Sie sicher wissen, was der absolute Bereich des Schwimmer ist im voraus.
Andere Tipps
Wenn Sie vorhaben, dies zu tun ....
Dim a as double
Dim b as double
a = 0.15
b = 0.01
Sie müssen die Rundenfunktion in Ihre IF-Anweisung wie folgt hinzufügen ...
If Round(a,2) = Round(b,2) Then
//code inside block will now trigger.
End If
Siehe auch hier für weitere Microsoft Referenz .
Es ist nie klug Doppel auf Gleichheit zu vergleichen.
Einige Dezimalwerte Karte auf mehrere Gleitkommadarstellungen. So ein 0,6 ist nicht immer gleich die anderen 0,6.
Wenn wir das eine vom anderen subtrahieren, wir wahrscheinlich so etwas wie ,00000000051 bekommen.
Wir können nun die Gleichheit mit einem Unterschied kleinen, dass eine gewisse Fehlerspanne.
definierenHier ist eine einfache Funktion, die ich schrieb:
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
Nennen Sie es mit:
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)
Wie bereits erwähnt, können viele Dezimalzahlen nicht genau wie traditionelle dargestellt werden Gleitkommatypen. Je nach Art des Problem Raum, können Sie den Dezimal-VBA-Typ sein besser mit den Dezimalzahlen (Basis 10) mit perfekter Präzision bis zu einem gewissen Dezimalpunkt vertreten kann. Dies wird oft getan für die Darstellung von Geld zum Beispiel in die 2-stelligen Dezimalgenauigkeit wird oft gewünscht wird.
Dim a as Decimal
Dim b as Decimal
a = 0.15
b = 0.01
Die Daten Währungstyp kann eine gute Alternative sein. Es behandelt eine relativ große Anzahl mit fester vierstelliger Genauigkeit.
Arbeits-a-round ?? Nicht sicher, ob dies alle Szenarien beantworten, aber ich lief in ein Problem abgerundete Doppelwerte in VBA zu vergleichen. Wenn ich auf Zahlen verglichen, die nach dem Runden identisch zu sein schienen, würde VBA falsch auslösen in einer if-then-Anweisung vergleichen. Meine Verlegenheit war zwei Conversions, erstes Doppel bespannen laufen, dann Zeichenfolge zu verdoppeln, und führen Sie dann die vergleichen.
Simulierte Beispiel Ich habe nicht die genauen Zahlen notieren, die den Fehler in diesem Beitrag erwähnt verursacht wird, und die Beträge in meinem Beispiel lösen keine das Problem zur Zeit und sollen die Art des Problems darstellen.
Sub Test_Rounded_Numbers()
Dim Num1 As Double
Dim Num2 As Double
Let Num1 = 123.123456789
Let Num2 = 123.123467891
Let Num1 = Round(Num1, 4) '123.1235
Let Num2 = Round(Num2, 4) '123.1235
If Num1 = Num2 Then
MsgBox "Correct Match, " & Num1 & " does equal " & Num2
Else
MsgBox "Inccorrect Match, " & Num1 & " does not equal " & Num2
End If
'Here it would say that "Inccorrect Match, 123.1235 does not equal 123.1235."
End Sub
Sub Fixed_Double_Value_Type_Compare_Issue()
Dim Num1 As Double
Dim Num2 As Double
Let Num1 = 123.123456789
Let Num2 = 123.123467891
Let Num1 = Round(Num1, 4) '123.1235
Let Num2 = Round(Num2, 4) '123.1235
'Add CDbl(CStr(Double_Value))
'By doing this step the numbers
'would trigger if they matched
'100% of the time
If CDbl(CStr(Num1)) = CDbl(CStr(Num2)) Then
MsgBox "Correct Match"
Else
MsgBox "Inccorrect Match"
End If
'Now it says Here it would say that "Correct Match, 123.1235 does equal 123.1235."
End Sub