J'ai le code suivant en Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Quelle est la meilleure façon d'écrire la condition if?
java
bigdecimal
JoJo
la source
la source
Réponses:
Utilisez
compareTo(BigDecimal.ZERO)
au lieu deequals()
:La comparaison avec la
BigDecimal
constanteBigDecimal.ZERO
évite d'avoir à construirenew BigDecimal(0)
chaque exécution.FYI, a
BigDecimal
également des constantesBigDecimal.ONE
etBigDecimal.TEN
pour votre commodité.Remarque!
La raison pour laquelle vous ne pouvez pas l'utiliser
BigDecimal#equals()
est qu'elle prend en compte l' échelle :il ne convient donc pas pour une comparaison purement numérique. Cependant,
BigDecimal.compareTo()
ne tient pas compte de l'échelle lors de la comparaison:la source
Alternativement, signum () peut être utilisé:
la source
BigDecimal.ZERO.compareTo(null)
lancera NPEIl y a une constante que vous pouvez vérifier:
la source
equals
etcompareTo
n'est pas comme vous le pensez. docs.oracle.com/javase/1.5.0/docs/api/java/math/…J'utilise généralement les éléments suivants:
la source
Alternativement, je pense qu'il convient de mentionner que le comportement des méthodes equals et compareTo dans la classe BigDecimal ne sont pas cohérents .
Cela signifie essentiellement que:
Par conséquent, vous devez être très prudent avec l'échelle de votre
someValue
variable, sinon vous obtiendriez un résultat inattendu.la source
Vous voudriez utiliser equals () car ce sont des objets, et utiliser l'instance ZERO intégrée:
Notez que
.equals()
prend en compte l'échelle, donc à moins que selectPrice n'ait la même échelle (0) que.ZERO
cela retournera false.Pour prendre l'échelle de l'équation pour ainsi dire:
Je dois noter que pour certaines situations mathématiques,
0.00 != 0
c'est pourquoi j'imagine.equals()
tenir compte de l'échelle.0.00
donne une précision à la centième place, alors qu'il0
n'est pas si précis. Selon la situation avec laquelle vous voudrez peut-être rester.equals()
.la source
equals
etcompareTo
n'est pas comme vous le pensez. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
prend en compte l'échelle, ce qui n'est pas ce que nous voulons ici.equals
devrait être utilisé à la place decompareTo()
. L'OP ne spécifie pas quel type de mathématiques il utilise, vous avez donc raison, il vaut mieux lui donner les deux options.GriffeyDog est définitivement correct:
Code:
Résultats:
Bien que je comprenne les avantages de la comparaison BigDecimal, je ne la considérerais pas comme une construction intuitive (comme le sont les opérateurs ==, <,>, <=,> =). Lorsque vous tenez un million de choses (ok, sept choses) dans votre tête, alors tout ce que vous pouvez réduire votre charge cognitive est une bonne chose. J'ai donc construit quelques fonctions pratiques utiles:
Voici comment les utiliser:
Les résultats ressemblent à ceci:
la source
Je veux juste partager ici quelques extensions utiles pour kotlin
la source
la source
Il existe une constante statique qui représente 0 :
Vous devriez faire ceci au lieu de:
afin d'éviter le cas où
selectPrice
estnull
.la source
equals
etcompareTo
n'est pas comme vous le pensez. docs.oracle.com/javase/1.5.0/docs/api/java/math/…