0.2*0.7=0.139999999999 ? [Résolu]

adrick33 26 Messages postés jeudi 30 juillet 2015Date d'inscription 14 juin 2017 Dernière intervention - 14 juin 2017 à 12:10 - Dernière réponse : _Ritchi_ 18322 Messages postés samedi 17 mars 2007Date d'inscriptionContributeurStatut 16 janvier 2018 Dernière intervention
- 17 juin 2017 à 17:17
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 

6 réponses

Répondre au sujet
daminator25 3321 Messages postés mardi 19 janvier 2010Date d'inscription 26 septembre 2017 Dernière intervention - Modifié par daminator25 le 14/06/2017 à 12:25
0
Utile
1
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.

Après la résolution de votre problème, ne vous barrez pas en courant ... Cochez votre sujet en "Résolu", Merci
adrick33 26 Messages 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à.
Commenter la réponse de daminator25
Whismeril 10794 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 janvier 2018 Dernière intervention - 14 juin 2017 à 21:55
0
Utile
2
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 15148 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 15 janvier 2018 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.
daminator25 3321 Messages postés mardi 19 janvier 2010Date d'inscription 26 septembre 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.
Commenter la réponse de Whismeril
_Ritchi_ 18322 Messages postés samedi 17 mars 2007Date d'inscriptionContributeurStatut 16 janvier 2018 Dernière intervention - Modifié par _Ritchi_ le 17/06/2017 à 17:19
0
Utile
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
Commenter la réponse de _Ritchi_