web-dev-qa-db-de.com

Verwendung von Vergleichsoperatoren wie>, =, <in BigDecimal

Ich habe eine Domänenklasse, in der unitPrice als BigDecimal-Datentyp festgelegt ist. Jetzt versuche ich, eine Methode zu erstellen, um den Preis zu vergleichen, aber es scheint, als könnte ich keine Vergleichsoperatoren im BigDecimal-Datentyp haben. Muss ich den Datentyp ändern oder gibt es einen anderen Weg?

55
user3127109

Jedes Objekt der Klasse BigDecimal hat eine Methode compareTo , die Sie verwenden können, um es mit einem anderen BigDecimal zu vergleichen. Das Ergebnis von compareTo wird je nach Bedarf > 0, == 0 oder < 0 verglichen. Lesen Sie die Dokumentation und Sie werden es herausfinden.

Die Operatoren ==, <, > usw. können nur für primitive Datentypen wie int, long, double oder deren Wrapper-Klassen wie Integerund Double verwendet werden.

Aus der Dokumentation von compareTo:

Vergleicht diese BigDecimal mit der angegebenen BigDecimal

Zwei BigDecimal Objekte, deren Wert gleich ist, aber eine andere Skalierung haben (wie 2.0 und 2.00), werden von dieser Methode als gleich betrachtet. Diese Methode wird bereitgestellt den individuellen Methoden für jeden der sechs Booleschen .__ vorziehen. Vergleichsoperatoren (<, ==,>,> =,! =, <=). Das vorgeschlagene Idiom für Die Durchführung dieser Vergleiche ist: (x.compareTo(y) <op> 0), wobei <op> ist einer der sechs Vergleichsoperatoren.

Kehrt zurück: -1, 0 oder 1, da dieses BigDecimal numerisch kleiner als, gleich oder größer als Wert ist.

69
Simulant

Um es kurz zu fassen: 

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
57
torina

Verwenden Sie die compareTo - Methode von BigDecimal:

public int compareTo (BigDecimal-Wert) Vergleicht diesen BigDecimal-Wert mit dem angegebenes BigDecimal. 

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

Sie können die Methode compareTo, x.compareTo(y) verwenden. 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

9
Agung Setiawan

BigDecimal ist keine Grundform, daher können Sie die Operatoren <, > nicht verwenden. Da es sich um eine Comparable handelt, können Sie die compareTo(BigDecimal) zu demselben Effekt verwenden. Z.B.:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
5
Mureinik

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
0
ognjenkl

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);
0
Alexey