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?


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.


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 // ">="    

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.

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


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

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...
}

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);

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) .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.