Mam następujący kod w Javie;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Jaki jest najlepszy sposób na napisanie warunku if?
java
bigdecimal
JoJo
źródło
źródło
Odpowiedzi:
Użyj
compareTo(BigDecimal.ZERO)
zamiastequals()
:Porównanie ze
BigDecimal
stałąBigDecimal.ZERO
pozwala uniknąć konstruowanianew BigDecimal(0)
każdego wykonania.FYI,
BigDecimal
ma również stałeBigDecimal.ONE
iBigDecimal.TEN
dla Twojej wygody.Uwaga!
Nie możesz używać
BigDecimal#equals()
, ponieważ bierze pod uwagę skalę :więc nie nadaje się do czysto numerycznego porównania. Jednak
BigDecimal.compareTo()
nie uwzględnia skali przy porównywaniu:źródło
Alternatywnie można użyć signum () :
źródło
BigDecimal.ZERO.compareTo(null)
rzuci NPEIstnieje stała, którą możesz sprawdzić w stosunku do:
źródło
equals
icompareTo
nie jest takie, jak myślisz. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Zwykle używam następujących:
źródło
Alternatywnie, myślę, że warto wspomnieć, że zachowanie metod równości i metod porównywania w klasie BigDecimal nie jest ze sobą zgodne .
Zasadniczo oznacza to, że:
Dlatego musisz bardzo uważać na skalę w
someValue
zmiennej, w przeciwnym razie uzyskasz nieoczekiwany wynik.źródło
Chciałbyś użyć equals (), ponieważ są obiektami, i użyć wbudowanej instancji ZERO:
Zauważ, że
.equals()
bierze się pod uwagę skalę, więc jeśli selectPrice jest tej samej skali (0),.ZERO
to wtedy zwróci false.Aby wyjąć skalę z równania:
Powinienem zauważyć, że w niektórych sytuacjach matematycznych,
0.00 != 0
dlatego wyobrażam sobie, że.equals()
bierze pod uwagę skalę.0.00
daje precyzję setnym miejscu, a0
nie jest tak precyzyjne. W zależności od sytuacji, z którą chcesz się trzymać.equals()
.źródło
equals
icompareTo
nie jest takie, jak myślisz. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
bierze pod uwagę skalę, której nie chcemy tutaj.equals
należy użyć zamiastcompareTo()
. OP nie określa, jakiego rodzaju matematyki używa, więc masz rację, lepiej dać mu obie opcje.GriffeyDog jest zdecydowanie poprawny:
Kod:
Wyniki:
Chociaż rozumiem zalety porównania BigDecimal, nie uważałbym go za intuicyjną konstrukcję (podobnie jak operatory ==, <,>, <=,> =). Kiedy trzymasz w głowie milion rzeczy (ok, siedem rzeczy), wtedy wszystko, co możesz zmniejszyć obciążenie poznawcze, jest dobrą rzeczą. Zbudowałem więc kilka użytecznych funkcji:
Oto jak z nich korzystać:
Wyniki wyglądają następująco:
źródło
Chcę tylko udostępnić tutaj kilka pomocnych rozszerzeń dla kotlin
źródło
źródło
Istnieje stała statyczna reprezentująca 0 :
Powinieneś to zrobić zamiast:
w celu uniknięcia przypadku, w którym
selectPrice
jestnull
.źródło
equals
icompareTo
nie jest takie, jak myślisz. docs.oracle.com/javase/1.5.0/docs/api/java/math/…