2011-12-14 1 views
1

Possible en double:
How to round a number to n decimal places in Javamultiplication à virgule flottante en java

Lors de la multiplication de deux nombres en java arrive ceci:

double a = 9.495 * 100; 

Résultat attendu:

a = 949.5; 

Mais le résultat obtenu est:

a = 949.4999999999999 

Lorsque je tente de nombre rond 9,495 à deux décimales, le résultat est 9,49 au lieu de 9,50

Toute idée comment résoudre ce problème?

+3

Il s'agit d'un malentendu classique sur le fonctionnement des nombres à virgule flottante. Veuillez consulter plusieurs des questions existantes sur le sujet. –

+1

Voir http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency. Cette question est posée presque tous les jours. –

Répondre

3

Si vous souhaitez des calculs précis à virgule flottante, n'utilisez pas les types float ou double, mais utilisez plutôt la classe BigDecimal.

+0

ne sais pas pourquoi cela a été rejeté? –

+0

moi non plus, j'attendais un commentaire expliquant ... –

+0

Je suppose que c'est parce que BigDecimal ne résout pas vraiment les problèmes avec les opérations à virgule flottante: il peut y avoir une représentation décimale finie pour 1/5, mais il n'y a pas 't pour 1/3, 1/7, 1/11, 1/13, et ainsi de suite. À un certain niveau, cela ne fait que rendre les erreurs plus conformes à ce que nous attendons de notre expérience de calcul en représentation décimale, donc «précis» semble être une affirmation très forte ... mais en regardant de plus près, cela aide beaucoup les clients à comprendre et décidez comment gérer les erreurs lorsqu'elles surviennent. –

1

Vous ne pouvez pas. Les nombres à virgule flottante et à double précision dans un ordinateur ne peuvent pas représenter toutes les valeurs possibles.

+0

et je ne sais pas pourquoi cela a été rejeté soit –

1

Ceci est un effet secondaire de floating point calculations, et est bien compris, mais pas nécessairement intuitif. Cette question a été posée littéralement des milliers de fois, et vous devez étudier comment fonctionne l'arithmétique en virgule flottante. Pour contourner ce problème, si vous avez seulement besoin d'une précision 2-décimale, utilisez plutôt un nombre entier. Par exemple, si vous traitez une devise et que vous souhaitez acheter 100 articles pour 4,95 €, vous représentez le coût de cette valeur sous la forme "495", multiplié par 100, ce qui vous donne "49500". Vous toujours traiter les deux derniers chiffres en cents, de sorte que "49500" est 495,00 $.

+0

et celui-ci? Pourquoi les bonnes réponses sont-elles rejetées? –

+0

Peut-être parce que nous répondons plutôt que de voter pour fermer en double, car il s'agit d'un doublon au maximum. :) C'est juste un vote - pas de biggie. C'est probablement l'une des questions les plus posées en informatique. – jefflunt

Questions connexes