cs_nico_44
Messages postés13Date d'inscriptionvendredi 21 juillet 2006StatutMembreDernière intervention 6 mai 2013
-
25 mars 2008 à 15:11
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
25 mars 2008 à 17:34
Bonjour à toutes et à tous,
J'ai un problème avec les float.
Je communique avec une base de données dans laquelle est stockée notamment un tarif.
L'un de ces tarifs est 1.43 (et le stockage est correct dans la base).
Dès que je l'importe en C++ dans un float, je n'ai plus 1.43, mais 1.4299999 !!
J'ai voulu vérifier si cela pouvait provenir de moi, et j'ai donc testé celà :
float Test = 1.43;
Dès l'affectation, Test vaut 1.4299999 !!
Et celà est aléatoire, certains nombres sont stockés correctement dans le type float, d'autres pas.
Et vous comprendrez que dès qu'on doit effectuer un calcul portant sur des milliers d'articles, 1.43, c'est totalement différent 1.4299999.
Quelqu'un peut-il m'expliquer comment corriger ce problème?
cs_nico_44
Messages postés13Date d'inscriptionvendredi 21 juillet 2006StatutMembreDernière intervention 6 mai 2013 25 mars 2008 à 16:28
Je sais que le codage dans la base est correct, car je fais également certains calculs directement dans cette base, et la base travaille bien avec 1.43.
Pour l'instant, j'ai réussi à contourner mon problème en ne travaillant plus avec des float, mais avec des double.
En double, je stocke 1.429999999999999
Les calculs qui sont faits sont plus précis.
Il ne me reste plus qu'à vérifier le bon fonctionnement avec un bon jeu de test.
En attendant, si quelqu'un peut m'expliquer pourquoi 1.43 est stocké en 1.4299999 en float ou 1.429999999999999 en double, ce serait gentil.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 25 mars 2008 à 17:27
Simplement parce que les nombres flottants sont codés en base 2; l'écriture d'un nombre peut être finie dans une base et infinie dans une autre.
Exemple :
en base 3, 1/3 s'écrit simplement 0.1
en base 10, par contre 0.3333333333...
autre exemple :
en base 10, 1/10 s'écrit 0.1en base 2, par contre 1/10 1/16 + 1/32 +1/128 +... 0.001101...