Problème avec les float

cs_nico_44 Messages postés 13 Date d'inscription vendredi 21 juillet 2006 Statut Membre Dernière intervention 6 mai 2013 - 25 mars 2008 à 15:11
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Derniè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?

Merci d'avance pour vos réponses.

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 16:13
Les flottants sont by design en simle ou double IMprécision, tous les nombres ne sont pas codables dans ces formats.


Comment sais-tu que le codage est correct ? je pense plutot à l'affichage correctement arrondi.


Si tu as besoin de précision, tu stockes en centimes dans ta base, ainsi tu travailles sur des entiers et oust les problèmes.

ciao...
BruNews, MVP VC++
0
cs_nico_44 Messages postés 13 Date d'inscription vendredi 21 juillet 2006 Statut Membre Derniè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.

Merci pour ta réponse BruNews ;)
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
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...
0
cs_nico_44 Messages postés 13 Date d'inscription vendredi 21 juillet 2006 Statut Membre Dernière intervention 6 mai 2013
25 mars 2008 à 17:33
Ok merci.

Ceci explique alors pourquoi 1.25 est correctement stocké (1.2500000).
1.25 = 1 + 1/4
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
25 mars 2008 à 17:34
Effectivement.
0
Rejoignez-nous