10
votes

Comment sauver Decimal en Java

Avoir le code suivant en Java:

double operation = 890 / 1440;  
System.out.println(operation);  


2 commentaires

Où voulez-vous "sauver"?


Les opérations sur les numéros de points flottants (flottants ou doubles) ne donnent pas de résultat exact, ce qui les rend inappropriés à tout calcul financier qui nécessite un résultat exact et non approximativement. Utilisez BigDecimal à la place.


7 Réponses :


18
votes

Initialisez votre variable avec une expression qui évalue à un double plutôt que d'int: xxx

sinon l'expression est effectuée à l'aide de l'arithmétique entier (qui finit par tronquer le résultat). Ce résultat tronqué est ensuite converti en un double .


3 commentaires

Bien que cela soit joli, il peut être utile de lancer explicitement les deux chiffres. La raison en est que si quelqu'un (même l'OP plus tard) est devenu plus tard et change les chiffres, ils peuvent oublier d'ajouter les décimales et la fonctionnalité se brisera mystérieusement.


Je suis d'accord, la solution 123D de Bozho est préférée comme l'intention plus claire.


Un de nombreux gotchas. Je préfère laisser un petit commentaire dans ce cas. Quelque chose comme: "Double littéraux doit être utilisé. Les littéraux entier entraîneront des arithmétiques entier." C'est toujours un petit rappel pourquoi est-ce le cas.



13
votes

Vous pouvez utiliser le double littéral d - sinon vos numéros sont pris en compte de type int : xxx

alors vous pouvez utiliser un numberFormat à Spécifiez le nombre de chiffres.

par exemple: xxx


2 commentaires

Le numéroFormat me permet-il d'économiser quatre chiffres décimaux dans une variable ou d'affiche uniquement les premiers chiffres décimaux "x"?


NumberFormat n'affecte que la présentation, la variable 'opération' n'est pas affectée



5
votes

Ceci est fait à l'aide de BigDecimal xxx

sortie

opération: 0.6180555555555556 échelonné: 0.6181


0 commentaires

7
votes

Vous pouvez également faire quelque chose comme ceci: xxx

qui imprime les éléments suivants:

0.6180555555555556

Vous pouvez vérifier comment arrondir le numéro ici


2 commentaires

N'oubliez pas que vous ne coulez pas (890/1440) pour doubler avec cela. Vous coulez 890 pour doubler avec ceci. Et une opération (double / int) renvoie un double.


Oui. Mais je pense que cette méthode est un peu meilleure puisqu'il fonctionne également lorsque vous avez des variables doubles au lieu de codées dures, au moins, dans C #, je l'avais l'habitude d'expérimenter le même problème et de la fixer comme ci-dessus.



2
votes

BigDecimal, bien que très maladroit fonctionne avec, donne quelques options de formatage:

    BigDecimal first = new BigDecimal(890);
    BigDecimal second = new BigDecimal(1440);
    System.out.println(first.divide(second, new MathContext(4, RoundingMode.HALF_EVEN)));


0 commentaires

0
votes

Si vous voulez vraiment arrondir sur les 4 premiers chiffres fractionnaires, vous pouvez également utiliser des arithmétiques entier en multipliant le premier numéro afin que ses chiffres soient déplacés de la quantité appropriée de la quantité F dans la gauche:

long fractionalPart = 10000L * 890L / 1440L;


0 commentaires

1
votes
double operation = 890.0 / 1440;
System.out.printf(".4f\n", operation);

0 commentaires