Come utilizzare operatori di confronto come>, =, <su BigDecimal


103

Ho una classe di dominio con unitPrice impostato come tipo di dati BigDecimal. Ora sto cercando di creare un metodo per confrontare il prezzo ma sembra che non sia possibile avere operatori di confronto nel tipo di dati BigDecimal. Devo cambiare il tipo di dati o c'è un altro modo per aggirare?


dal momento che BigDecimalè un Object, no, non funziona. Ma potresti semplicemente sottrarre uno dall'altro e controllare se il valore risultante è <0, ==0o >0. Altrimenti potresti seguire la via standard con i metodi forniti da BigDecimal
SomeJavaGuy

2
Ecco perché esiste un compareTometodo che restituisce -1, 0 o 1. Che è fondamentalmente il Comparable.
M. Deinum

Risposte:


113

Ogni oggetto della classe BigDecimalha un metodo compareToche puoi usare per confrontarlo con un altro BigDecimal. Il risultato di compareToviene quindi confrontato > 0, == 0o < 0a seconda di che cosa avete bisogno. Leggi la documentazione e lo scoprirai.

Gli operatori ==, <, >e così via possono essere utilizzati solo su tipi di dati primitivi come int, long, doubleo le loro classi wrapper come Integere Double.

Dalla documentazione di compareTo:

Confronta questo BigDecimalcon il file specificato BigDecimal.

Due BigDecimal oggetti che hanno un valore uguale ma hanno una scala diversa (come 2.0 e 2.00) sono considerati uguali con questo metodo. Questo metodo viene fornito preferibilmente ai metodi individuali per ciascuno dei sei operatori di confronto booleano (<, ==,>,> =,! =, <=). L'idioma suggerito per eseguire questi confronti è:, (x.compareTo(y) <op> 0)dove <op> è uno dei sei operatori di confronto.

Restituisce: -1, 0 o 1 poiché questo BigDecimal è numericamente minore, uguale o maggiore di val.


1
Ma il metodo compareTo aiuta a capire se il prezzo è maggiore, uguale o inferiore a?
user3127109

2
Sì. Quelle informazioni sono nel link fornito nella risposta.
Drew Kennedy

4
@ user3127109 sì, a.compareTo(b)restituisce un numero maggiore di zero se a > b, 0se a == be minore di zero se a < b.
Zoltán

119

In breve:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

Utilizza il compareTometodo BigDecimal:

public int compareTo (BigDecimal val) Confronta questo BigDecimal con il BigDecimal specificato.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

12

È possibile utilizzare il metodo di nome compareTo, x.compareTo(y). Restituirà 0 se xey sono uguali, 1 se x è maggiore di y e -1 se x è minore di y


11

Ecco un esempio per tutti e sei gli operatori di confronto booleani (<, ==,>,> =,! =, <=):

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

5

BigDecimalnon è un primitivo, quindi non è possibile utilizzare i <, >operatori. Tuttavia, poiché è a Comparable, puoi usare compareTo(BigDecimal)lo stesso effetto. Per esempio:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}

0

Utilizzando com.ibm.etools.marshall.util.BigDecimalRange util class di IBM è possibile confrontare se BigDecimal è nell'intervallo.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);

0

Questo thread ha molte risposte che affermano che il metodo BigDecimal.compareTo (BigDecimal) è quello da utilizzare per confrontare le istanze BigDecimal . Volevo solo aggiungere per non più esperienza con l'utilizzo del metodo BigDecimal.compareTo (BigDecimal) per fare attenzione a come stai creando le tue istanze BigDecimal . Quindi, per esempio ...

  • new BigDecimal(0.8)creerà BigDecimalun'istanza con un valore che non è esattamente 0.8e che ha una scala di 50+,
  • new BigDecimal("0.8")creerà BigDecimalun'istanza con un valore che è esattamente 0.8e che ha una scala di 1

... e i due saranno considerati disuguali secondo il metodo BigDecimal.compareTo (BigDecimal) perché i loro valori non sono uguali quando la scala non è limitata a poche cifre decimali.

Prima di tutto, fai attenzione a creare le tue BigDecimalistanze con il BigDecimal(String val)costruttore o il BigDecimal.valueOf(double val)metodo piuttosto che con il BigDecimal(double val)costruttore. In secondo luogo, nota che puoi limitare la scala delle istanze BigDecimal prima di confrontarle tramite il metodo BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

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.