2016-01-08 6 views
23

Ich habe eine Domain-Klasse mit unitPrice als BigDecimal-Datentyp festgelegt. Jetzt versuche ich eine Methode zu erstellen, um den Preis zu vergleichen, aber es scheint, als ob ich keine Vergleichsoperatoren im BigDecimal-Datentyp haben kann. Muss ich den Dateityp ändern oder gibt es einen anderen Weg?Verwendung von Vergleichsoperatoren wie>, =, <auf BigDecimal

+0

da 'BigDecimal' ein' Objekt' ist, funktioniert das nicht. Sie können jedoch einfach voneinander subtrahieren und prüfen, ob der resultierende Wert '<0', '== 0' oder '> 0' ist. Ansonsten könntest du den Standardweg mit den von [BigDecimal] bereitgestellten Methoden gehen (http://stackoverflow.com/questions/6787142/bigdecimal-equals-versus-compareto) – SomeJavaGuy

+2

Deshalb gibt es eine 'compareTo' Methode die -1 zurückgibt , 0 oder 1. Was ist im Grunde das ["Comparable"] (https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html). –

Antwort

32

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 dann verglichen > 0, == 0 oder < 0 je nachdem, was Sie brauchen. Lesen Sie die Dokumentation und Sie werden es herausfinden.

Die Betreiber ==, <, > usw. können nur auf primitive Datentypen wie int, long, double oder Klassen ihre Wrapper wie Integer und Double verwendet werden.

Aus der Dokumentation von compareTo:

Vergleicht diese BigDecimal mit dem angegebenen BigDecimal.

Zwei BigDecimal Objekte, die im Wert gleich sind, haben aber eine andere Skala (wie 2,0 und 2.00) werden durch dieses Verfahren als gleich betrachtet. Diese Methode wird gegenüber einzelnen Methoden für jeden der sechs booleschen Vergleichsoperatoren bereitgestellt (<, ==,>,> =,! =, < =). Das vorgeschlagene Idiom für Durchführung dieser Vergleiche ist: (x.compareTo(y) <op> 0), wobei <op> einer der sechs Vergleichsoperatoren ist.

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

+0

Aber hilft die compareTo-Methode beim Finden, ob der Preis größer als, gleich oder niedriger als ist? – user3127109

+1

Ja. Diese Information befindet sich in dem Link in der Antwort. –

+0

@ user3127109 Ja, 'a.compareTo (b)' gibt eine Zahl größer als Null zurück, wenn 'a 'b', '0' wenn 'a == b', und kleiner als Null wenn 'a

12

die compareTo Methode BigDecimal Verwendung:

public int compareTo (BigDecimal val) vergleicht diesen mit dem BigDecimal angegebenen BigDecimal.

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

BigDecimal ist keine primitive, so dass Sie nicht die <, > Betreiber nutzen können. Da es sich jedoch um eine Comparable handelt, können Sie die compareTo(BigDecimal) mit demselben Effekt verwenden. Z.B .:

public class Domain { 
    private BigDecimal unitPrice; 

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

    // etc... 
} 
2

Sie Methode compareTo Namen verwenden können, x.compareTo(y). Es wird 0 zurückgeben, wenn x und y gleich sind, 1, wenn x größer als y und -1, wenn x kleiner als y

5

Um kurz:

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

Mit com.ibm.etools. Marshall.util.BigDecimalRange util Klasse von IBM kann man vergleichen, wenn BigDecimal im Bereich.

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