Es gab ein Problem beim Umgang mit Zahlungsbetragsbetrag in den letzten zwei Tagen. Ich habe die Equals -Methode von BigDecimal verwendet, um zu vergleichen, ob die beiden Beträge gleich sind, was zu einem Fehler im Betragvergleich führte (z. B. den Vergleich zwischen 3,0 und 3,00 usw.).
[Hinweis: Im Folgenden geht es um Sun JDK Version 1.4.2 als Beispiel. Die Implementierung anderer Versionen ist möglicherweise nicht konsistent. Bitte ignorieren Sie sie.
Schauen wir uns zunächst einen Blick auf die Equals -Methode von BigDecimal:
public boolean Equals (Objekt x) {if (! (x Instanz bigDecimal)) return false; bigDecimal xdec = (bigdecimal) x; return scal == xdec.scale && intval.equals (xdec.intval); }Sie können sehen, dass die EUquals -Methode von BigDecimal darin besteht, zuerst den zu verglichenen Datentyp zu bestimmen. Wenn die Objekttypen konsistent sind, wird gleichzeitig festgelegt, ob die Genauigkeit (Skala) und der Wert (die Equals -Methode von Biginteger) konsistent sind.
Tatsächlich ist es in Javadoc bereits sehr klar: "Vergleicht dieses BigDecimal mit dem angegebenen Objekt für die Gleichheit. Im Gegensatz zu Vergleiche berücksichtigt diese Methode zwei BigDecimal -Objekte, die nur dann gleich sind, wenn sie an Wert und Skala gleich sind (also ist 2,0 im Vergleich dieser Methode nicht gleich 2,00)." Ich habe einfach nicht aufgepasst!
Schauen wir uns die Vergleichsmethode an:
public int vergleicheto (BigDecimal val) {/ * Optimierung: würde ohne die nächsten drei Zeilen gut laufen this; arg [1] = val; Matchscale (arg); return arg [0] .intval.comPareto (arg [1] .Intval); } Sie können sehen, dass in dieser Methode eine MatchScale -Verarbeitung vorhanden ist, was bedeutet, dass das Objekt mit geringer Genauigkeit in eine hohe Genauigkeit umgewandelt und dann (auch die Vergleichsmethode von Biginteger) verglichen wird. Die Implementierung von MatchScale ist wie folgt:
private static void Matchscale (BigDecimal [] Val) {if (val [0] .Scale <val [1] .Scale) Val [0] = val [0] .Setscale (Val [1] .Scale); sonst if (val [1] .Scale <val [0] .Scale) Val [1] = val [1]. } Machen Sie einen einfachen Test:
System.out.println (neuer BigDecimal ("1,2"). Equals (New BigDecimal ("1,20")); // Ausgabe falsystems.out.println (neuer BigDecimal ("1.2"). Vergleiche (neuer BigDecimal ("1,20") == 0); // Ausgabe true Stellte auch fest, dass der BigDecimal Constructor oben in Saiten weitergegeben wird. Was passt dann passieren, wenn das in Zahlentyp übergab? Sie können es selbst testen und die Gründe analysieren:
System.out.println (neuer BigDecimal ("1,2"). Equals (New BigDecimal ("1,20")); // Ausgabe falsystems.out.println (neuer BigDecimal ("1.2"). Vergleiche (neuer BigDecimal ("1,20") == 0); // Ausgabe true system.out.println (neuer BigDecimal (1.2) .Equals (neuer BigDecimal ("1,20")); // Ausgabe ist es? System.out.println (neuer BigDecimal (1.2) .Compareto (neuer BigDecimal ("1,20") == 0); // ist die Ausgabe? System.out.println (neue BigDecimal (1.2) .Equals (New BigDecimal (1,20))); // ist die Ausgabe? System.out.println (neuer BigDecimal (1.2) .Compareto (neuer BigDecimal (1,20)) == 0); // ist die Ausgabe?Die endgültige Schlussfolgerung lautet: Für den Größenvergleich von BigDecimal wird die Verwendung der Equals -Methode nicht nur die Größe des Wertes vergleichen, sondern auch die Genauigkeit der beiden Objekte vergleichen. Die Vergleichsmethode vergleichen nicht die Genauigkeit, sondern nur die Größe des Wertes.
Schließlich verachte ich mich. Ich habe Java -Sprache seit so vielen Jahren verwendet und habe den gesunden Menschenverstand nicht einmal herausgefunden!
Der obige Artikel spricht kurz über den Unterschied zwischen BigDecimals Gleichen und Vergleiche in Java ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.