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?
java
operator-keyword
bigdecimal
user3127109
źródło
źródło
BigDecimal
jestObject
, nie, to nie działa. Ale możesz po prostu odjąć jeden od drugiego i sprawdzić, czy wynikowa wartość to<0
,==0
lub>0
. W przeciwnym razie możesz przejść standardową drogą z metodami dostarczonymi z BigDecimalcompareTo
metoda, która zwraca -1, 0 lub 1. Zasadniczo jest toComparable
.Odpowiedzi:
Każdy obiekt klasy
BigDecimal
ma metodę,compareTo
której możesz użyć do porównania go z innym BigDecimal. WynikcompareTo
jest następnie porównywany> 0
,== 0
lub< 0
w 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 jakint
,long
,double
lub ich klas otoki, jakInteger
iDouble
.Z dokumentacji
compareTo
:źródło
a.compareTo(b)
zwraca liczbę większą od zera jeślia > b
,0
jeślia == b
i mniejszą od zera, jeślia < b
.Krótko mówiąc:
źródło
Użyj
compareTo
metody BigDecimal:źródło
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źródło
Oto przykład dla wszystkich sześciu logicznych operatorów porównania (<, ==,>,> =,! =, <=):
źródło
BigDecimal
Nie jest to prymitywne, więc nie można użyć<
,>
operatorów. Jednak ponieważ jest to aComparable
, możesz użyćcompareTo(BigDecimal)
tego samego efektu. Na przykład:źródło
Korzystając z klasy użytkowej com.ibm.etools.marshall.util.BigDecimalRange IBM, można porównać, czy wartość BigDecimal znajduje się w zakresie.
źródło
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)
utworzyBigDecimal
instancję z wartością, która nie jest dokładnie0.8
i która ma skalę 50+,new BigDecimal("0.8")
utworzyBigDecimal
instancję z wartością, która jest dokładnie0.8
i 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ć
BigDecimal
instancje za pomocąBigDecimal(String val)
konstruktora lubBigDecimal.valueOf(double val)
metody, a nieBigDecimal(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) .źródło