Nombre décimal != Nombre à virgule flotante
Bonjour à tous,
Pour résumer la situation le comportement que vous avez découvert n'est pas surprenant, vous aurez le même quelque soit le langage utilisé (à condition que le compilateur utilise vraiment les nombre à virgule flotante, désasembler pour en avoir le coeur net).
En informatique on sépare deux catégories de nombre décimaux :
- les nombres à virgule flotante : pratique, rapide (souvent utilisant les capacité d'un coprocesseur avec des instructions spécifiques)
- les nombres décimaux "traditionels" : complexe & lent (car peu ou pas accéléré dans le matériel, sauf instructions additionelles)
Les nombres à virgule flotante sont parfait pour : les calculs scientifiques (mesures d'élément réel, statistiques, 3D ...) car sauf besoin de précision absolu, la légère différence de valeur constatée n'aura aucune différence sur l'exactitude (signification) des résultats.
En Java suivant si l'on à besoin de plus ou moins de précision, on choisira un type float (simple précision) ou un double (double précision) qui sont tout deux des types simples. Si l'on désire que le comportement des calculs flotant soit strictement compatible avec la norme IEEE, on peut utiliser le modificateur strictfp. Ceci sera peut-être un peu plus lent (optimisation moins agréssible de la VM), mais assurera une totale portabilité entre VM/microprocesseur.
Par contre ces nombre à virgules ne doivent JAMAIS être utilisés en comptabilité car c'est une matière où les calculs doivent être exacts et suivre des règles d'arrondi stricts. A cet effet, il existe un type BigDecimal (un type complexe), qui permet de faire tous les calculs dont on a besoin tout en maitrisant intégralement le niveau de précision, d'arrondi, etc.
Un peu de lecture avec des exemples de calculs de compta :
http://javapronews.com/javapronews-47-20050509HowtheBigDecimalClassHelpsJavagetitsArithmeticRight.html
Il en va de même pour tout calcul nécessitant coute que coute une exactitude absolue.
Voilà, maintenant plus besoin de vous prendre la tête.
A noter que cette différence existe à ma connaissance dans bon nombre de langage Java/C/C++/C#/Pascal ... (sauf encore une fois, directive particuliere de compilation surchargeant le comportement habituel) tout simplement car c'est une contrainte matérielle ;-)
Un petit article dans une FAQ avec un lien sur tout celà serrait pas mal ..
A+
JB