Betrachten Sie die einfache Testklasse:
import java.math.BigDecimal;
/**
* @author The Elite Gentleman
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}
}
Sie können (bewusst) sagen, dass dies x
gleich ist y
(keine Objektreferenz), aber wenn Sie das Programm ausführen, zeigt das folgende Ergebnis:
false
true
Frage: Was ist der Unterschied zwischen compareTo()
und equals()
in BigDecimal
dem compareTo
kann feststellen , dass x
gleich y
?
PS: Ich sehe, dass BigDecimal eine inflate()
Methode für eine equals()
Methode hat. Was macht inflate()
eigentlich?
java
equals
bigdecimal
compareto
Buhake Sindi
quelle
quelle
inflate()
: Es ist nicht Teil der öffentlichen API, da es nur die interne Darstellung manipuliert und keine sichtbaren Auswirkungen nach außen hat. Wenn Sie sich also nichtBigDecimal
eingehend mit der Implementierung von befassen möchten, empfehlen wir Ihnen, diese Methode zu ignorieren.Antworten:
Die Antwort befindet sich im JavaDoc der
equals()
Methode :Mit anderen Worten:
equals()
Überprüft, ob dieBigDecimal
Objekte in jeder Hinsicht genau gleich sind . "nur" vergleicht ihren numerischen Wert.compareTo()
In Bezug auf , warum
equals()
diese Art und Weise verhält, dies beantwortet wurde in dieser Frage SO .quelle
BigDecimal
wenn Sie JavaDoc nicht sorgfältig lesen. :) - Wir haben einige seltsame Fehler, bis wir den Unterschied erkannten.BigDecimal
ist eine solche Sache. Daher sollte man immer das JavaDoc überprüfen. Zumindest wenn Sie herausfinden, dass etwas Seltsames passiert.Grundsätzlich
inflate()
AnrufeBigInteger.valueOf(intCompact)
bei Bedarf, dh es den nicht skalierten Wert erzeugt, der als gespeichertBigInteger
auslong intCompact
. Wenn Sie das nicht brauchenBigInteger
und der nicht skalierte Wert in a passt,long
BigDecimal
scheint er zu versuchen, so lange wie möglich Platz zu sparen.quelle
BigDecimal
sein nicht skalierter Wert sowohl in along
als auch in a bleibtBigInteger
. Wenn dasBigInteger
intern nicht benötigt wird, wird es nicht erstellt, aber wenn es benötigt wird (z. B. wennequals
ein aufgeblasenes und ein nicht aufgeblasenesBigDecimal)
Inflate () `zum Erstellen verwendet wird. - Um es zusammenzufassen:inflate()
behandelt interne Konvertierungen, falls erforderlich und seitdem ist privat, es sollte für Benutzer der Klasse keine Rolle spielen.Ich glaube, dass die richtige Antwort darin besteht, die beiden Zahlen (BigDecimals) auf die gleiche Skala zu bringen, dann können wir über ihre Gleichheit entscheiden. Sind diese beiden Zahlen beispielsweise gleich?
Nun, es kommt auf die Skala an. Auf der Skala 5 (5 Dezimalstellen) sind sie nicht gleich. Bei kleineren Dezimalstellen (Skala 4 und niedriger) werden sie jedoch als gleich angesehen. Also schlage ich vor, die Skala der beiden Zahlen gleich zu machen und sie dann zu vergleichen.
quelle
Sie können auch mit einem doppelten Wert vergleichen
quelle