322 votes

Comparez si BigDecimal est supérieur à zéro.

Comment puis-je comparer si BigDecimal est supérieure à zéro ?

1 votes

Examinez github.com/mortezaadi/bigdecimal-utils Il existe une méthode isPositive() et d'autres méthodes comme is(bigdecimal).isZero() ; is(bigdecimal).notZero() ; is(bigdecimal).isPositive() ; // supérieur à zéro is(bigdecimal).isNegative() ; // inférieur à zéro is(bigdecimal).isNonPositive() ; // inférieur ou égal à zéro is(bigdecimal).isNonNegative() ;

0 votes

@MortezaAdi depuis BigDecimal met en œuvre Comparable les fonctions de comparaison comme lt, le, eq, ne doit être déplacée vers un ComparableUtils . Ils peuvent donc être utilisés pour toute autre classe comme Date ou des types personnalisés.

0 votes

@djmj les exigences définissent l'implémentation, il n'y avait ni besoin ni intention de construire ComparableUtils. De plus, la fonctionnalité de lt, le, eq, etc. est totalement différente de la fonctionnalité générique.

509voto

Jon Skeet Points 692016

C'est aussi simple que ça :

if (value.compareTo(BigDecimal.ZERO) > 0)

El la documentation pour compareTo spécifie en fait qu'il retournera -1, 0 ou 1, mais le plus général Comparable<T>.compareTo ne garantit que des valeurs inférieures à zéro, nulles ou supérieures à zéro dans les trois cas appropriés - je m'en tiens donc généralement à cette comparaison.

59 votes

Un mot d'avertissement supplémentaire s'impose. Supposons que value a une valeur de zéro mais une échelle non nulle (par exemple, il évalue à 0.00 au lieu de 0 ). Vous voulez probablement considérer qu'elle est égale à zéro. Le site compareTo() le fera en effet. Mais le equals() ne le fera pas. (Une autre preuve, s'il en fallait une, que Loki ou l'un de ses avatars est bien vivant et s'est reconverti dans le développement de logiciels).

16 votes

Si je reconnais que c'est la solution idiomatique en Java, je ne pense pas qu'elle soit réellement lisible. Chaque fois que je rencontre une expression de ce type, je me retrouve à écrire un test pour m'assurer que je l'ai bien comprise. Peut-être que le fait que des classes récemment ajoutées, comme LocalDate inclure isBefore est une indication qu'Oracle ressent la même chose. Ce n'est pas idéal, mais je pense qu'il est marginalement plus lisible dans ces circonstances d'écrire un utilitaire isGreaterThan méthode.

0 votes

La solution de @Jon Skeet fonctionne-t-elle également si la valeur est 0.00 ou 0.0 ?

223voto

Anton Bessonov Points 1801

Meilleure solution possible :

if (value.signum() > 0)

signum renvoie -1, 0 ou 1 si la valeur de ce BigDecimal est négative, nulle ou positive.

13 votes

BigDecimal.compareTo() commence par comparer les signes par souci d'optimisation. Il est donc probablement préférable d'appeler compareTo(), car cela révèle mieux l'intention et ne coûte que le prix d'un appel de méthode supplémentaire (qui, je le soupçonne, serait inlined de toute façon).

34 votes

Cela fait partie de l'API publique. Il s'agit donc, à mon avis, d'une meilleure méthode. L'objectif est de déterminer si le signe est positif (c'est-à-dire > ZERO).

0 votes

Pensez-vous que les performances soient meilleures si l'on ne saisit que le premier caractère d'un fichier String initialisé BigDecimal pour voir si c'est - ou pas ? C'est ma meilleure idée de la façon dont ça pourrait fonctionner. Il me semble plus rapide de déterminer si le numéro est 0 . Est-ce correct ? Merci beaucoup d'avance Anton Bessonov !

14voto

yOshi Points 29

Il est plus sûr d'utiliser la méthode compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

impression console

    result ==> 1

compareTo() renvoie à

  • 1 si a est supérieur à b
  • -1 si b est inférieur à b
  • 0 si a est égal à b

Maintenant, pour votre problème, vous pouvez utiliser

if (value.compareTo(BigDecimal.ZERO) > 0)

o

if (value.compareTo(new BigDecimal(0)) > 0)

J'espère que cela vous a aidé.

12voto

duffymo Points 188155

Utilice compareTo() qui est intégrée à la classe.

1voto

Satya M Points 11

L'utilisation de la méthode ".intValue()" sur un objet BigDecimal n'est pas adaptée lorsque l'on veut vérifier si sa valeur est supérieure à zéro. La seule option qui reste est la méthode ".compareTo()".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X