Quand je parlais de valeurs monétaires, je parlais bien des montants. Si tu les stockes en double, tu vas avoir des problèmes lors des sommes. Un double c'est du binaire, un montant d'opération c'est en base 10. Le soucis c'est que la conversion base 10 vers base 2 n'est pas toujours possible sans perte de précisions.
Exemple
0,6 = 1 x 2^-1 + 0 x 2^-2 + 0 x 2^-3 + 1 x 2^-4 + ...
Au final on tombe jamais sur 0,6 mais sur 0,599999999999...
Ce n'est pas le cas pour tout les nombres. Exemple : 0,5 = 1 x 2^-1. Donc 0,5 en base 10 s'écrit 0b0,1. Pas de perte de précision. Je ne saurais pas estimer la fréquence de ces problèmes mais de manière empirique j'ai constaté que c'était fréquent.
Si on additionne plein de doubles qui sont dans ce cas, on va tomber sur des résultat faux. J'ai du régler ce soucis dans un soft qui éditait des factures avec pas mal de lignes. Ma solution a été de créer une classe money qui stockait sa valeur en centime dans un entier. Si ça t'intéresse je dois pouvoir te retrouver l'implémentation. Mais elle est triviale.
[^] # Re: Gestion des valeurs monétaires
Posté par guppy . En réponse au journal KissCount v0.1. Évalué à 2.
Exemple
0,6 = 1 x 2^-1 + 0 x 2^-2 + 0 x 2^-3 + 1 x 2^-4 + ...
Au final on tombe jamais sur 0,6 mais sur 0,599999999999...
Ce n'est pas le cas pour tout les nombres. Exemple : 0,5 = 1 x 2^-1. Donc 0,5 en base 10 s'écrit 0b0,1. Pas de perte de précision. Je ne saurais pas estimer la fréquence de ces problèmes mais de manière empirique j'ai constaté que c'était fréquent.
Si on additionne plein de doubles qui sont dans ce cas, on va tomber sur des résultat faux. J'ai du régler ce soucis dans un soft qui éditait des factures avec pas mal de lignes. Ma solution a été de créer une classe money qui stockait sa valeur en centime dans un entier. Si ça t'intéresse je dois pouvoir te retrouver l'implémentation. Mais elle est triviale.