Comparer si BigDecimal est supérieur à zéro

245

Comment comparer si la BigDecimalvaleur est supérieure à zéro?

Santhosh
la source
1
regardez dans github.com/mortezaadi/bigdecimal-utils il y a une méthode isPositive () il y a aussi comme is (bigdecimal) .isZero (); est (bigdecimal) .notZero (); est (bigdecimal) .isPositive (); // supérieur à zéro est (bigdecimal) .isNegative (); // moins de zéro est (bigdecimal) .isNonPositive (); // inférieur ou égal à zéro est (bigdecimal) .isNonNegative ();
Morteza Adi
@MortezaAdi depuis BigDecimalimplémente Comparableles fonctions de comparaison comme lt, le, eq, nemieux être déplacé vers a ComparableUtils. Ils peuvent donc être utilisés pour toutes les autres classes, comme Dateles types personnalisés.
djmj
@djmj requirements définit l'implémentation, il n'y avait ni besoin ni intention de construire ComparableUtils. Outre les fonctionnalités de lt, le, eq, etc., elles sont totalement différentes de celles génériques.
Morteza Adi

Réponses:

401

C'est aussi simple que:

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

La documentation decompareTo spécifie en fait qu'il renverra -1, 0 ou 1, mais la Comparable<T>.compareTométhode plus générale ne garantit que moins de zéro, zéro ou supérieur à zéro pour les trois cas appropriés - donc je m'en tiens généralement à cette comparaison.

Jon Skeet
la source
50
Un mot d'avertissement supplémentaire s'impose. Supposons que cela valueait une valeur de zéro mais une échelle non nulle (par exemple, il évalue à 0.00au lieu de 0). Vous voudrez probablement considérer qu'il est égal à zéro. La compareTo()méthode le fera en effet. Mais la equals()méthode ne le sera pas. (Une autre preuve, le cas échéant, que Loki ou l'un de ses avatars est bel et bien vivant et est passé au développement de logiciels.)
Andrew Spencer
9
Bien que je convienne qu'il s'agit de la solution idiomatique en Java, je ne pense pas qu'elle soit réellement lisible. Chaque fois que je rencontre une expression comme celle-ci, je me retrouve à écrire un test pour me rassurer que je l'ai dans le bon sens. Peut-être le fait que des classes récemment ajoutées, comme LocalDateinclude, isBeforesoit une indication qu'Oracle ressent la même chose. Ce n'est pas idéal, mais je pense qu'il est légèrement plus lisible dans ces circonstances d'écrire une isGreaterThanméthode utilitaire .
Mark Slater
La solution @Jon Skeet fonctionne-t-elle également si la valeur est 0,00 ou 0,0
Angelina
1
@ Angelina: Je m'attendrais à ce que, certainement - ces valeurs ne soient pas supérieures à 0, donc je m'attendrais compareToà retourner 0. Mais si vous êtes inquiet, il devrait être facile pour vous de tester.
Jon Skeet
@MarkSlater Je suis d'accord, le compareTo est juste que Java devrait investir plus de temps dans l'amélioration de la lisibilité et cela n'a aucun sens si tout le monde doit créer ses propres méthodes lisibles dans chaque projet. En C #, vous pouvez également créer des méthodes d'extension pour les classes existantes afin que vous puissiez utiliser directement `value.isGreaterThen (foo)` `
djmj
165

Meilleur moyen possible :

if (value.signum() > 0)
Anton Bessonov
la source
12
BigDecimal.compareTo () commence par comparer les signaux comme une optimisation. Il est donc probablement préférable d'appeler compareTo (), car il est plus révélateur d'intention et ne coûte que le prix d'un appel de méthode supplémentaire (qui, je le soupçonne, serait de toute façon intégré).
Andrew Spencer
27
Cela fait partie de l'API publique. c'est donc, pour moi, une meilleure façon. l'intention EST de déterminer si le signe est positif (c.-à-d.> ZÉRO)
Marc
Pensez-vous que ce soit une performance plus élevée s'il n'attrape que le premier caractère d'un Stringinitialisé BigDecimalpour voir s'il l'est -ou non? C'est ma meilleure estimation de la façon dont cela pourrait fonctionner. Semble plus rapide pour réellement déterminer si le nombre est 0. Est-ce correct? Merci beaucoup d'avance Anton Bessonov!
5
Si vous regardez la BigDecimal.compareTo()méthode décompilée , vous constaterez qu'elle appelle signum()deux fois. Donc, en ce qui concerne les performances, signum()c'est mieux.
MeIr
1
Quel était votre problème avec les décimales? @jfajunior
İsmail Yavuz
11

Utilisez la compareTo()fonction intégrée à la classe.

duffymo
la source
1

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 de la console

    result ==> 1

compareTo() Retour

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

ou

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

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

yOshi
la source
0

utiliser ".intValue ()" sur un objet BigDecimal n'est pas correct lorsque vous voulez vérifier si sa râpe est supérieure à zéro. La seule option qui reste est la méthode ".compareTo ()".

Satya M
la source
-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");
Rama Krishna
la source
L'obj contient une chaîne numérique. Dans la réponse acceptée, la valeur n'est pas déclarée, peut être source de confusion. Ma réponse sera plus claire.
Rama Krishna