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?
java
operator-keyword
bigdecimal
user3127109
la source
la source
BigDecimal
c'est unObject
, non cela ne fonctionne pas. Mais vous pouvez simplement en soustraire un et vérifier si la valeur résultante est<0
,==0
ou>0
. Sinon, vous pouvez suivre la méthode standard avec les méthodes fournies par BigDecimalcompareTo
méthode qui renvoie -1, 0 ou 1. Ce qui est fondamentalement leComparable
.Réponses:
Chaque objet de la classe
BigDecimal
a une méthode quecompareTo
vous pouvez utiliser pour le comparer à un autre BigDecimal. Le résultat decompareTo
est ensuite comparé> 0
,== 0
ou en< 0
fonction 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 commeint
,long
,double
ou leurs classes wrapper commeInteger
etDouble
.De la documentation de
compareTo
:la source
a.compareTo(b)
renvoie un nombre supérieur à zéro sia > b
,0
sia == b
, et inférieur à zéro sia < b
.Pour être bref:
la source
Utilisez la
compareTo
méthode de BigDecimal:la source
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 yla source
Voici un exemple pour les six opérateurs de comparaison booléens (<, ==,>,> =,! =, <=):
la source
BigDecimal
n'est pas une primitive, de sorte que vous ne pouvez pas utiliser les<
,>
opérateurs. Cependant, puisque c'est unComparable
, vous pouvez utiliser lecompareTo(BigDecimal)
pour le même effet. Par exemple:la source
En utilisant com.ibm.etools.marshall.util.BigDecimalRange classe util d'IBM, on peut comparer si BigDecimal est dans la plage.
la source
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 uneBigDecimal
instance avec une valeur qui n'est pas exactement0.8
et qui a une échelle de 50+,new BigDecimal("0.8")
créera uneBigDecimal
instance avec une valeur qui est exactement0.8
et 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
BigDecimal
instances avec leBigDecimal(String val)
constructeur ou laBigDecimal.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) .la source