Confronta se BigDecimal è maggiore di zero


245

Come posso confrontare se il BigDecimalvalore è maggiore di zero?


1
guarda in github.com/mortezaadi/bigdecimal-utils c'è un metodo isPositive () ci sono anche come is (bigdecimal) .isZero (); è (BigDecimal) .notZero (); è (BigDecimal) .isPositive (); // maggiore di zero è (bigdecimal) .isNegative (); // minore di zero è (bigdecimal) .isNonPositive (); // minore di o uguale a zero è (bigdecimal) .isNonNegative ();
Morteza Adi,

@MortezaAdi dal momento che BigDecimalimplementa Comparablele funzioni di confronto come lt, le, eq, nemeglio essere spostato in un ComparableUtils. Quindi possono essere utilizzati per qualsiasi altra classe simile Dateo tipi personalizzati.
djmj,

I requisiti di @djmj definiscono l'implementazione, non c'erano né necessità né intenzione di costruire ComparableUtils. Oltre alle funzionalità di lt, le, eq, ecc. Sono totalmente diverse da quelle generiche.
Morteza Adi,

Risposte:


401

È semplice come:

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

La documentazione percompareTo effettivamente specifica che restituirà -1, 0 o 1, ma il Comparable<T>.compareTometodo più generale garantisce solo meno di zero, zero o maggiore di zero per i tre casi appropriati, quindi di solito mi limito a quel confronto.


50
È richiesta un'ulteriore avvertenza. Supponiamo che valueabbia un valore pari a zero ma una scala diversa da zero (ad esempio, valuta 0.00invece di 0). Probabilmente vuoi considerare che è uguale a zero. Il compareTo()metodo lo farà davvero. Ma il equals()metodo non lo farà. (Un'altra prova, se ce ne fosse bisogno, che Loki o uno dei suoi avatar sia vivo e vegeto e sia passato allo sviluppo del software.)
Andrew Spencer,

9
Mentre sono d'accordo che questa è la soluzione idiomatica in Java, non penso che sia effettivamente leggibile. Ogni volta che incontro un'espressione come questa, mi ritrovo a scrivere un test per rassicurarmi che ho capito bene. Forse il fatto che classi aggiunte di recente, come LocalDateinclude, isBeforeindica che Oracle si sente allo stesso modo. Non è l'ideale, ma penso che sia leggermente più leggibile in queste circostanze scrivere un isGreaterThanmetodo di utilità .
Mark Slater,

La soluzione @Jon Skeet funziona anche se il valore è 0,00 o 0,0
Angelina

1
@Angelina: mi sarei aspettato, certamente - quei valori non sono maggiori di 0, quindi mi aspetto compareTodi restituire 0. Ma se sei preoccupato, dovrebbe essere facile per te testare.
Jon Skeet,

@MarkSlater Sono d'accordo, il confrontoPer solo Java dovrebbe investire più tempo nel miglioramento della leggibilità e non ha senso se tutti devono creare i propri metodi leggibili in ogni progetto. In C # puoi anche creare metodi di estensione per le classi esistenti in modo da poter usare direttamente `value.isGreaterThen (pippo)` `
djmj

165

Possibile modo migliore :

if (value.signum() > 0)

12
BigDecimal.compareTo () inizia confrontando i signum come ottimizzazione. Quindi è probabilmente meglio chiamare compareTo (), poiché è più rivelatore di intenzioni e costa solo il prezzo di una chiamata di metodo extra (che sospetto sarebbe comunque inclusa).
Andrew Spencer,

27
Questo fa parte dell'API pubblica. quindi per me è un modo migliore. l'intenzione è di determinare se il segno è positivo (cioè> ZERO)
Marc

Pensi che sia più performante se prende solo il primo personaggio di un Stringinizializzato BigDecimalper vedere se lo è -o no? Questa è la mia migliore ipotesi su come potrebbe funzionare. Sembra più veloce per determinare effettivamente se il numero è 0. È corretto? Grazie mille in anticipo Anton Bessonov!

5
Se osservi il BigDecimal.compareTo()metodo decompilato , scoprirai che chiama signum()due volte. Quindi, per quanto riguarda le prestazioni, signum()è meglio.
MeIr

1
Qual è stato il tuo problema con i casi decimali? @jfajunior
İsmail Yavuz

11

Utilizzare la compareTo()funzione integrata nella classe.


1

è più sicuro usare il metodo compareTo()

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

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

stampa console

    result ==> 1

compareTo() ritorna

  • 1 se a è maggiore di b
  • -1 se b è inferiore a b
  • 0 se a è uguale a b

ora per il tuo problema puoi usare

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

o

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

Spero che ti abbia aiutato.


0

l'utilizzo di ".intValue ()" sull'oggetto BigDecimal non è corretto quando si desidera verificare se la sua grattugia è zero. L'unica opzione rimasta è il metodo ".compareTo ()".


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

L'obj contiene una stringa numerica, nella risposta accettata il valore non è dichiarato, potrebbe essere fonte di confusione. La mia risposta avrà più chiarezza.
Rama Krishna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.