Ich habe eine Domänenklasse mit unitPrice als BigDecimal-Datentyp festgelegt. Jetzt versuche ich, eine Methode zum Vergleichen des Preises zu erstellen, aber es scheint, dass ich keine Vergleichsoperatoren im BigDecimal-Datentyp haben kann. Muss ich den Datentyp ändern oder gibt es einen anderen Weg?
java
operator-keyword
bigdecimal
user3127109
quelle
quelle
BigDecimal
ist einObject
, nein das funktioniert nicht. Aber man könnte einfach ein subtrahiert voneinander und prüfen , ob der resultierende Wert ist<0
,==0
oder>0
. Andernfalls könnten Sie den Standard mit den bereitgestellten Methoden von BigDecimalcompareTo
Methode, die -1, 0 oder 1 zurückgibtComparable
.Antworten:
Jedes Objekt der Klasse
BigDecimal
verfügt über eine Methode, mit dercompareTo
Sie es mit einem anderen BigDecimal vergleichen können. Das ErgebniscompareTo
wird dann verglichen> 0
,== 0
oder< 0
je nachdem , was Sie brauchen. Lesen Sie die Dokumentation und Sie werden es herausfinden.Die Betreiber
==
,<
,>
und so kann sich nur auf primitive Datentypen verwendet werden , wieint
,long
,double
oder deren Wrapper - Klassen wieInteger
undDouble
.Aus der Dokumentation von
compareTo
:quelle
a.compareTo(b)
gibt eine Zahl zurück, die größer als Null ist, wenna > b
,0
wenna == b
und kleiner als Null, wenna < b
.Um es kurz zu fassen:
quelle
Verwenden Sie die
compareTo
Methode von BigDecimal:quelle
Sie können die Methode mit dem Namen
compareTo
,x.compareTo(y)
. Es wird 0 zurückgegeben, wenn x und y gleich sind, 1, wenn x größer als y ist und -1, wenn x kleiner als y istquelle
Hier ist ein Beispiel für alle sechs booleschen Vergleichsoperatoren (<, ==,>,> = ,! =, <=):
quelle
BigDecimal
kein primitiv ist, so dass Sie nicht die verwenden können<
,>
Operatoren. Da es sich jedoch um einen handeltComparable
, können SiecompareTo(BigDecimal)
den gleichen Effekt verwenden. Z.B:quelle
Mit der com.ibm.etools.marshall.util.BigDecimalRange util-Klasse von IBM kann man vergleichen, ob BigDecimal im Bereich liegt.
quelle
Dieser Thread enthält zahlreiche Antworten, die besagen, dass die BigDecimal.compareTo- Methode (BigDecimal) zum Vergleichen von BigDecimal- Instanzen verwendet werden kann. Ich wollte nur hinzufügen, dass ich noch keine Erfahrung mit der Verwendung der BigDecimal.compareTo (BigDecimal) -Methode habe, um vorsichtig zu sein, wie Sie Ihre BigDecimal- Instanzen erstellen . Also zum Beispiel ...
new BigDecimal(0.8)
erstellt eineBigDecimal
Instanz mit einem Wert, der nicht genau ist0.8
und eine Skala von 50+ hat.new BigDecimal("0.8")
eine erstellenBigDecimal
Instanz mit einem Wert, der ist genau0.8
und die eine Skala von 1... und die beiden werden laut BigDecimal.compareTo (BigDecimal) als ungleich angesehen. Methode da ihre Werte ungleich sind, wenn die Skalierung nicht auf wenige Dezimalstellen beschränkt ist.
Stellen Sie zunächst sicher, dass Sie Ihre
BigDecimal
Instanzen mit demBigDecimal(String val)
Konstruktor oder derBigDecimal.valueOf(double val)
Methode und nicht mit dem Konstruktor erstellenBigDecimal(double val)
. Beachten Sie zweitens, dass Sie die Skalierung von BigDecimal- Instanzen vor dem Vergleich mithilfe der BigDecimal.setScale- Methode (int newScale, RoundingMode roundingMode) einschränken können .quelle