Porównaj, jeśli BigDecimal jest większy od zera

245

Jak mogę porównać, jeśli BigDecimalwartość jest większa od zera?

Santhosh
źródło
1
zajrzyj na github.com/mortezaadi/bigdecimal-utils istnieje metoda isPositive (), istnieją również metody is (bigdecimal) .isZero (); is (bigdecimal) .notZero (); is (bigdecimal) .isPositive (); // większa niż zero to (bigdecimal) .isNegative (); // mniej niż zero to (bigdecimal) .isNonPositive (); // mniejsza lub równa zero to (bigdecimal) .isNonNegative ();
Morteza Adi
@MortezaAdi, ponieważ BigDecimalimplementuje Comparablefunkcje porównywania, takie jak lt, le, eq, nelepiej zostać przeniesionym do ComparableUtils. Dzięki temu można ich używać do dowolnych innych klas, takich jak Datelub niestandardowych typów.
djmj
Wymagania @djmj definiują implementację, nie było potrzeby ani zamiaru budowania porównywalnego narzędzia. Oprócz funkcjonalności lt, le, eq itp. Są zupełnie inne niż ogólne.
Morteza Adi

Odpowiedzi:

401

To tak proste, jak:

if (value.compareTo(BigDecimal.ZERO) > 0)

DokumentacjicompareTo faktycznie określa, że zwróci -1, 0 lub 1, ale bardziej ogólny Comparable<T>.compareTosposób tylko gwarantuje mniej niż zero, zero, lub większym niż zero dla odpowiednich trzech przypadkach - tak ja zwykle po prostu trzymać się tego porównania.

Jon Skeet
źródło
50
Wymagane jest dodatkowe słowo ostrzeżenia. Załóżmy, że valuema wartość zero, ale niezerową skalę (np. Oblicza 0.00zamiast 0). Prawdopodobnie chcesz wziąć pod uwagę, że jest to zero. compareTo()Metoda rzeczywiście to zrobić. Ale equals()metoda nie. (Kolejny dowód, jeśli taki był potrzebny, że Loki lub jeden z jego awatarów żyje i ma się dobrze, i zajął się tworzeniem oprogramowania.)
Andrew Spencer
9
Chociaż zgadzam się, że jest to idiomatyczne rozwiązanie w Javie, nie sądzę, aby było to w rzeczywistości czytelne. Za każdym razem, gdy spotykam się z takim wyrażeniem, piszę test, aby upewnić się, że mam właściwy sposób. Być może fakt, że ostatnio dodane klasy, takie jak LocalDatewłączanie isBefore, wskazuje, że Oracle czuje to samo. To nie jest idealne, ale myślę, że w tych okolicznościach napisanie isGreaterThanmetody narzędziowej jest nieco bardziej czytelne .
Mark Slater,
Czy rozwiązanie @Jon Skeet działa również, jeśli wartość wynosi 0,00 lub 0,0
Angelina
1
@Angelina: Spodziewam się, że tak, oczywiście - te wartości nie są większe niż 0, więc spodziewam compareTosię zwrócić 0. Ale jeśli się martwisz, testowanie powinno być łatwe.
Jon Skeet
@MarkSlater Zgadzam się, że CompareTo to po prostu, że Java powinna poświęcić więcej czasu na poprawę czytelności i nie ma sensu, aby każdy musiał tworzyć własne czytelne metody w każdym projekcie. W języku C # można również tworzyć metody rozszerzeń dla istniejących klas, dzięki czemu można bezpośrednio używać `value.isGreaterThen (foo)` `
djmj
165

Możliwy lepszy sposób :

if (value.signum() > 0)
Anton Bessonov
źródło
12
BigDecimal.compareTo () zaczyna się od porównania podpisów jako optymalizacji. Prawdopodobnie najlepiej więc wywołać funkcję CompareTo (), ponieważ jest ona bardziej ujawniająca zamiary i kosztuje tylko cenę wywołania dodatkowej metody (co, jak podejrzewam, i tak zostanie wprowadzone).
Andrew Spencer,
27
To jest część publicznego API. więc jest to dla mnie lepszy sposób. intencją jest ustalenie, czy znak jest dodatni (tj.> ZERO)
Marc
Czy uważasz, że ma wyższą wydajność, jeśli chwyta tylko pierwszą postać Stringzainicjowanego, BigDecimalaby sprawdzić, czy to jest, -czy nie? To moje najlepsze przypuszczenie, jak to może działać. Wydaje się szybsze, aby faktycznie ustalić, czy numer 0. Czy to jest poprawne? Z góry bardzo dziękuję Antonowi Bessonovowi!
5
Jeśli spojrzysz na BigDecimal.compareTo()metodę zdekompilowaną , zobaczysz, że wywołuje ona signum()dwa razy. Jeśli chodzi o wydajność, signum()jest ona lepsza.
MeIr
1
Jaki był twój problem z przypadkami dziesiętnymi? @jfajunior
İsmail Yavuz
11

Użyj compareTo()funkcji wbudowanej w klasę.

duffymo
źródło
1

bezpieczniej jest skorzystać z tej metody compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

wydruk na konsoli

    result ==> 1

compareTo() zwroty

  • 1, jeżeli a jest większe niż b
  • -1, jeśli b jest mniejsze niż b
  • 0, jeśli a jest równe b

teraz możesz użyć swojego problemu

if (value.compareTo(BigDecimal.ZERO) > 0)

lub

if (value.compareTo(new BigDecimal(0)) > 0)

Mam nadzieję, że ci pomogło.

YOshi
źródło
0

użycie „.intValue ()” na obiekcie BigDecimal jest niewłaściwe, gdy chcesz sprawdzić, czy jego wartość jest większa od zera. Pozostała tylko opcja „.compareTo ()”.

Satya M.
źródło
-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");
Rama Krishna
źródło
Obj zawiera ciąg liczbowy, w przyjętej odpowiedzi wartość nie jest zadeklarowana, może być myląca. Moja odpowiedź będzie bardziej przejrzysta.
Rama Krishna