Comment utiliser des opérateurs de comparaison comme>, =, <sur BigDecimal

103

J'ai une classe de domaine avec unitPrice définie comme type de données BigDecimal. J'essaie maintenant de créer une méthode pour comparer les prix, mais il semble que je ne puisse pas avoir d'opérateurs de comparaison dans le type de données BigDecimal. Dois-je changer de type de données ou existe-t-il une autre solution?

user3127109
la source
puisque BigDecimalc'est un Object, non cela ne fonctionne pas. Mais vous pouvez simplement en soustraire un et vérifier si la valeur résultante est <0, ==0ou >0. Sinon, vous pouvez suivre la méthode standard avec les méthodes fournies par BigDecimal
SomeJavaGuy
2
C'est pourquoi il existe une compareTométhode qui renvoie -1, 0 ou 1. Ce qui est fondamentalement le Comparable.
M. Deinum

Réponses:

113

Chaque objet de la classe BigDecimala une méthode que compareTovous pouvez utiliser pour le comparer à un autre BigDecimal. Le résultat de compareToest ensuite comparé > 0, == 0ou en < 0fonction de ce dont vous avez besoin. Lisez la documentation et vous le saurez.

Les opérateurs ==, <, >etc. ne peuvent être utilisés sur les types de données primitifs comme int, long, doubleou leurs classes wrapper comme Integeret Double.

De la documentation de compareTo:

Compare cela BigDecimalavec le spécifié BigDecimal.

Deux BigDecimal objets de valeur égale mais ayant une échelle différente (comme 2,0 et 2,00) sont considérés comme égaux par cette méthode. Cette méthode est fournie de préférence aux méthodes individuelles pour chacun des six opérateurs de comparaison booléens (<, ==,>,> =,! =, <=). L'idiome suggéré pour effectuer ces comparaisons est:, (x.compareTo(y) <op> 0)<op> est l'un des six opérateurs de comparaison.

Renvoie: -1, 0 ou 1 car ce BigDecimal est numériquement inférieur, égal ou supérieur à val.

Simulant
la source
1
Mais la méthode compareTo aide-t-elle à déterminer si le prix est supérieur, égal ou inférieur à?
user3127109
2
Oui. Cette information se trouve dans le lien fourni dans la réponse.
Drew Kennedy le
4
@ user3127109 yes, a.compareTo(b)renvoie un nombre supérieur à zéro si a > b, 0si a == b, et inférieur à zéro si a < b.
Zoltán
119

Pour être bref:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
torina
la source
22

Utilisez la compareTométhode de BigDecimal:

public int compareTo (BigDecimal val) Compare ce BigDecimal avec le BigDecimal spécifié.

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

Vous pouvez utiliser la méthode nommée compareTo, x.compareTo(y). Il renverra 0 si x et y sont égaux, 1 si x est supérieur à y et -1 si x est plus petit que y

Agung Setiawan
la source
11

Voici un exemple pour les six opérateurs de comparaison booléens (<, ==,>,> =,! =, <=):

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
ognjenkl
la source
5

BigDecimaln'est pas une primitive, de sorte que vous ne pouvez pas utiliser les <, >opérateurs. Cependant, puisque c'est un Comparable, vous pouvez utiliser le compareTo(BigDecimal)pour le même effet. Par exemple:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
Mureinik
la source
0

En utilisant com.ibm.etools.marshall.util.BigDecimalRange classe util d'IBM, on peut comparer si BigDecimal est dans la plage.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
Alexey
la source
0

Ce fil de discussion contient de nombreuses réponses indiquant que la méthode BigDecimal.compareTo (BigDecimal) est celle à utiliser pour comparer les instances BigDecimal . Je voulais juste ajouter que je ne connaissais plus l'utilisation de la méthode BigDecimal.compareTo (BigDecimal) pour faire attention à la façon dont vous créez vos instances BigDecimal . Donc, par exemple ...

  • new BigDecimal(0.8)créera une BigDecimalinstance avec une valeur qui n'est pas exactement 0.8et qui a une échelle de 50+,
  • new BigDecimal("0.8")créera une BigDecimalinstance avec une valeur qui est exactement 0.8et qui a une échelle de 1

... et les deux seront considérés comme inégaux selon la méthode BigDecimal.compareTo (BigDecimal) car leurs valeurs sont inégales lorsque l'échelle n'est pas limitée à quelques décimales.

Tout d'abord, veillez à créer vos BigDecimalinstances avec le BigDecimal(String val)constructeur ou la BigDecimal.valueOf(double val)méthode plutôt qu'avec leBigDecimal(double val) constructeur. Deuxièmement, notez que vous pouvez limiter l'échelle des instances BigDecimal avant de les comparer à l'aide de la méthode BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Adil Hussain
la source