Signaler

0.2*0.7=0.139999999999 ? [Résolu]

Posez votre question adrick33 26Messages postés jeudi 30 juillet 2015Date d'inscription 14 juin 2017 Dernière intervention - Dernière réponse le 17 juin 2017 à 17:17 par _Ritchi_
Bonjour, j'ai remarqué sur python lorsque l'on effectue le calcul 0.2*0.7, l'on obtient 0.139999999. je sais q'un nombre comme 0 avec 9999999 à l'infini après la virgule est égal à 1, et pareil pour 0.139999999... = 0.14 mais alors pourquoi python préfère afficher un résultat moins précis ?
(ce n'est pas le seul calcul où ça arrive: 0.2*0.8=0.16000000000000003 et d'autres)
Merci
Afficher la suite 
Utile
+0
plus moins
Bonjour,

Tu ne peux strictement rien y faire, ton ordinateur a sa manière de stocker les chiffres. Il fait au plus précis avec ce qu'il peut mais en réalité il ne stockera pas 0.03 mais peut être 0.029999998599968 car pour lui c'est le plus proche qu'il peut faire.
En fait pour être exacte l'ordinateur ne stocke pas une valeur mais une somme de fraction (1/3 + 1/8 + 6/33 + ...) et donc ça tombe pas forcément pile sur la valeur.

Du coup ce genre de problème tu ne peux que faire un arrondi pour ton résultat.
Parfois on peut éviter le problème par exemple en travaillant en centimes quand il s'agit de monétaire, mais sinon pas de contournement.
Tu peux essayer de modifier le type de valeur, (float, double, single ... pour affiner au mieux)

J'ai déjà rencontré ce problème.

adrick33 26Messages postés jeudi 30 juillet 2015Date d'inscription 14 juin 2017 Dernière intervention - 14 juin 2017 à 12:41
Merci pour votre réponse, cette petite erreur n'influe pas beaucoup lors d'un calcul et un arrondi peut en fausser d'autres alors je pense que je vais en rester là.
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonsoir,

je me permets une petite correction.
Pour un ordinateur, un nombre réel n'est pas une somme de fraction, mais un nombre à virgule flottante, voir cet article Wikipédia. Il faut penser qu'il travaille en binaire et non en décimal, c'est ce qui explique que les nombres "possibles" ne sont pas continus.
En décimal avec 14 chiffres significatifs on peut passer de 29999998599968 * 10^-16 à 29999998599969 * 10^-16.
En binaire on va se retrouver avec quelque chose du genre 1010101010101101010101010101101010 * 10^-10101010101010101000101010101 et incrémenter de 1 la mantisse donnera une correspondance discontinue en décimal.
KX 14437Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 24 juin 2017 Dernière intervention - 14 juin 2017 à 22:31
Remarque : cela revient quand même un peu à une somme de fraction.
Par contre ce sera des diviseurs en puissance de 2, de même qu'en décimal c'est des diviseurs en puissance de 10.

En décimal : 0.14 = 1/10 + 4/100
En binaire : 0.14 = 1/8 + 1/128 + 1/256 + 1/512 + 1/1024 + 1/4096 + ...

En fait ici on a le même problème que pour 1/3 = 0.33333333333333 en décimal, avec une infinité de 3 à la fin.

Parce que en binaire 0.14 s'écrit :
0.001000 1110101110001010001 1110101110001010001 1110101110001010001...
avec une infinité de 1110101110001010001 à la fin.
Répondre
daminator25 3279Messages postés mardi 19 janvier 2010Date d'inscription 15 juin 2017 Dernière intervention - 15 juin 2017 à 15:49
En effet je ne me souvenais plus que c'était des puissances de 2. J'aurais du m'en douter ... Car mes dénominateurs n'avaient aucun sens !
J'avais lu un jour l'astuce en vitesse, ça m'avait pas trop chamboulé a l'époque et la quand je dois retrouver la solution je suis bien embêté car je me souvenais plus :)

Merci pour la correction, je saurai pour la suite.
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Je t'invite à aller sur cette page Sam et Mac: les nombres en Python qui est assez ludique. Tu trouveras la réponse à ta question dans le paragraphe "L’éternel problème de la virgule qui part en couille" . Tu y découvriras que l'on peut faire quelque chose pour que 0.2*0.7 fasse 0.14

Ritchi
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !