2010-12-04 49 views
1

J'ai expérimenté ce qui ne va pas avec float et double types, en Java System.out.print (1-.6) imprime .4 et le résultat est un peu inattendu (0.30000000000000004) en cas de System.out.print (1-.7). Il serait utile que quelqu'un puisse me diriger vers des ressources qui expliquent pourquoi cela se produit. Je suppose que ce n'est pas spécifique à Java son quelque chose de fondamentalement faux avec ces types.Float et Double pour les valeurs monétaires

Merci!

+0

http://docs.sun.com/source/806-3568/ncg_goldberg.html –

+1

http://stackoverflow.com/questions/285680/representing-monetary-values-in-java donne la meilleure recommandation. Utilisez BigDecimal. –

+1

Je trouve que c'est une source d'amusement constant que, sur les 1 123 061 questions actuellement sur SO, 67% d'entre elles concernent des inexactitudes à virgule flottante :-) – paxdiablo

Répondre

3

Les types réels dans Java sont des implémentations de IEEE754 single and double precision floating point notation. Ce sont des approximations de nombres réels plutôt que des représentations exactes. Certains nombres réels comme 0,8 ne peuvent pas être représentés avec précision.

+0

Merci Vincent ! Je vais lire cette page, trop de symboles effrayants si :( – Abidi

+0

Trouvé celui-ci très utile http://ravisharda.blogspot.com/2010/09/floating-point-basics-made-easy.html – Abidi

1

Comme l'a dit Vincent les float et double types ne peuvent pas stocker des valeurs qui ne seront pas représentés comme la somme de 2^valeurs -n (taille n dépend de la mise en œuvre).

Utilisez plutôt la classe BigDecimal.

+0

Cheers, ouais je a lu ce fil sur l'utilisation de BigDecimal pour les calculs monétaires, était juste curieux de connaître ces types. – Abidi