Verwendung von Vergleichsoperatoren wie>, =, <auf BigDecimal

103

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?

user3127109
quelle
da BigDecimalist ein Object, nein das funktioniert nicht. Aber man könnte einfach ein subtrahiert voneinander und prüfen , ob der resultierende Wert ist <0, ==0oder >0. Andernfalls könnten Sie den Standard mit den bereitgestellten Methoden von BigDecimal
SomeJavaGuy
2
Deshalb gibt es eine compareToMethode, die -1, 0 oder 1 zurückgibt Comparable.
M. Deinum

Antworten:

113

Jedes Objekt der Klasse BigDecimalverfügt über eine Methode, mit der compareToSie es mit einem anderen BigDecimal vergleichen können. Das Ergebnis compareTowird dann verglichen > 0, == 0oder < 0je 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 , wie int, long, doubleoder deren Wrapper - Klassen wie Integerund Double.

Aus der Dokumentation von compareTo:

Vergleicht dies BigDecimalmit dem angegebenen BigDecimal.

Zwei BigDecimal Objekte mit gleichem Wert, aber unterschiedlicher Skalierung (z. B. 2.0 und 2.00) werden bei dieser Methode als gleich betrachtet. Diese Methode wird gegenüber einzelnen Methoden für jeden der sechs booleschen Vergleichsoperatoren (<, ==,>,> = ,! =, <=) Vorzug gegeben. Die vorgeschlagene Redewendung für die Durchführung dieser Vergleiche lautet : (x.compareTo(y) <op> 0), wobei <op> einer der sechs Vergleichsoperatoren ist.

Rückgabe: -1, 0 oder 1, da dieses BigDecimal numerisch kleiner, gleich oder größer als val ist.

Simulant
quelle
1
Aber hilft die compareTo-Methode dabei, festzustellen, ob der Preis größer, gleich oder niedriger als ist?
user3127109
2
Ja. Diese Informationen finden Sie in dem Link in der Antwort.
Drew Kennedy
4
@ user3127109 yes, a.compareTo(b)gibt eine Zahl zurück, die größer als Null ist, wenn a > b, 0wenn a == bund kleiner als Null, wenn a < b.
Zoltán
119

Um es kurz zu fassen:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
Torina
quelle
22

Verwenden Sie die compareToMethode von BigDecimal:

public int compareTo (BigDecimal val) Vergleicht dieses BigDecimal mit dem angegebenen BigDecimal.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
Arnaud
quelle
12

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 ist

Agung Setiawan
quelle
11

Hier ist ein Beispiel für alle sechs booleschen Vergleichsoperatoren (<, ==,>,> = ,! =, <=):

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true
ognjenkl
quelle
5

BigDecimalkein primitiv ist, so dass Sie nicht die verwenden können <, >Operatoren. Da es sich jedoch um einen handelt Comparable, können Sie compareTo(BigDecimal)den gleichen Effekt verwenden. Z.B:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}
Mureinik
quelle
0

Mit der com.ibm.etools.marshall.util.BigDecimalRange util-Klasse von IBM kann man vergleichen, ob BigDecimal im Bereich liegt.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
Alexey
quelle
0

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 eine BigDecimalInstanz mit einem Wert, der nicht genau ist 0.8und eine Skala von 50+ hat.
  • new BigDecimal("0.8")eine erstellen BigDecimalInstanz mit einem Wert, der ist genau 0.8und 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 BigDecimalInstanzen mit dem BigDecimal(String val)Konstruktor oder der BigDecimal.valueOf(double val)Methode und nicht mit dem Konstruktor erstellen BigDecimal(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 .

Adil Hussain
quelle