Jak używać operatorów porównania, takich jak>, =, <na BigDecimal

103

Mam klasę domeny z unitPrice ustawionym jako typ danych BigDecimal. Teraz próbuję utworzyć metodę porównywania cen, ale wygląda na to, że nie mogę mieć operatorów porównania w typie danych BigDecimal. Czy muszę zmienić typ danych, czy jest na odwrót?

user3127109
źródło
ponieważ BigDecimaljest Object, nie, to nie działa. Ale możesz po prostu odjąć jeden od drugiego i sprawdzić, czy wynikowa wartość to <0, ==0lub >0. W przeciwnym razie możesz przejść standardową drogą z metodami dostarczonymi z BigDecimal
SomeJavaGuy
2
Dlatego istnieje compareTometoda, która zwraca -1, 0 lub 1. Zasadniczo jest to Comparable.
M. Deinum,

Odpowiedzi:

113

Każdy obiekt klasy BigDecimalma metodę, compareToktórej możesz użyć do porównania go z innym BigDecimal. Wynik compareTojest następnie porównywany > 0, == 0lub < 0w zależności od tego, co trzeba. Przeczytaj dokumentację, a dowiesz się.

Operatorzy ==, <, >i tak dalej mogą być wykorzystane wyłącznie na prymitywnych typów danych, takich jak int, long, doublelub ich klas otoki, jak Integeri Double.

Z dokumentacji compareTo:

Porównuje to BigDecimalz określonym BigDecimal.

W BigDecimal tej metodzie dwa obiekty o równej wartości, ale o różnej skali (np. 2,0 i 2,00) są uznawane za równe. Ta metoda jest preferowana w stosunku do indywidualnych metod dla każdego z sześciu logicznych operatorów porównania (<, ==,>,> =,! =, <=). Sugerowany idiom do wykonywania tych porównań to:, (x.compareTo(y) <op> 0)gdzie <op> jest jednym z sześciu operatorów porównania.

Zwraca: -1, 0 lub 1, ponieważ ten BigDecimal jest liczbowo mniejszy, równy lub większy niż val.

Symulant
źródło
1
Ale czy metoda compareTo pomaga w ustaleniu, czy cena jest wyższa niż, równa czy niższa?
user3127109
2
Tak. Ta informacja znajduje się w linku podanym w odpowiedzi.
Drew Kennedy
4
@ user3127109 tak, a.compareTo(b)zwraca liczbę większą od zera jeśli a > b, 0jeśli a == bi mniejszą od zera, jeśli a < b.
Zoltán,
119

Krótko mówiąc:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
torina
źródło
22

Użyj compareTometody BigDecimal:

public int compareTo (BigDecimal val) Porównuje ten BigDecimal z określonym BigDecimal.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
Arnaud
źródło
12

Można użyć metody o nazwie compareTo, x.compareTo(y). Zwróci 0, jeśli x i y są równe, 1, jeśli x jest większe niż y i -1, jeśli x jest mniejsze niż y

Agung Setiawan
źródło
11

Oto przykład dla wszystkich sześciu logicznych operatorów porównania (<, ==,>,> =,! =, <=):

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
źródło
5

BigDecimalNie jest to prymitywne, więc nie można użyć <, >operatorów. Jednak ponieważ jest to a Comparable, możesz użyć compareTo(BigDecimal)tego samego efektu. Na przykład:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
Mureinik
źródło
0

Korzystając z klasy użytkowej com.ibm.etools.marshall.util.BigDecimalRange IBM, można porównać, czy wartość BigDecimal znajduje się w zakresie.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
Alexey
źródło
0

Ten wątek zawiera wiele odpowiedzi stwierdzających, że metoda BigDecimal.compareTo (BigDecimal) służy do porównywania wystąpień BigDecimal . Chciałem tylko dodać, że nie mam już doświadczenia w korzystaniu z metody BigDecimal.compareTo (BigDecimal) , aby zachować ostrożność podczas tworzenia instancji BigDecimal . Na przykład ...

  • new BigDecimal(0.8)utworzy BigDecimalinstancję z wartością, która nie jest dokładnie 0.8i która ma skalę 50+,
  • new BigDecimal("0.8")utworzy BigDecimalinstancję z wartością, która jest dokładnie 0.8i ma skalę 1

... i obie zostaną uznane za nierówne zgodnie z metodą BigDecimal.compareTo (BigDecimal) , ponieważ ich wartości są nierówne, gdy skala nie jest ograniczona do kilku miejsc po przecinku.

Przede wszystkim uważaj, aby tworzyć BigDecimalinstancje za pomocą BigDecimal(String val)konstruktora lub BigDecimal.valueOf(double val)metody, a nie BigDecimal(double val)konstruktora. Po drugie, zwróć uwagę, że możesz ograniczyć skalę instancji BigDecimal przed ich porównaniem za pomocą metody BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Adil Hussain
źródło