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?

War es hilfreich?

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.

definieren

Hier 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top