Problème avec les float

Signaler
Messages postés
13
Date d'inscription
vendredi 21 juillet 2006
Statut
Membre
Dernière intervention
6 mai 2013
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
13
Date d'inscription
vendredi 21 juillet 2006
Statut
Membre
Dernière intervention
6 mai 2013

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 ;)
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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...
Messages postés
13
Date d'inscription
vendredi 21 juillet 2006
Statut
Membre
Dernière intervention
6 mai 2013

Ok merci.

Ceci explique alors pourquoi 1.25 est correctement stocké (1.2500000).
1.25 = 1 + 1/4
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Effectivement.