0.2*0.7=0.139999999999 ?

Résolu/Fermé
adrick33 Messages postés 26 Date d'inscription jeudi 30 juillet 2015 Statut Membre Dernière intervention 14 juin 2017 - Modifié le 14 juin 2017 à 12:11
_Ritchi_ Messages postés 21288 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 11 novembre 2024 - 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
A voir également:

3 réponses

daminator25 Messages postés 3324 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 25 janvier 2020 308
Modifié le 14 juin 2017 à 12:25
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
0
adrick33 Messages postés 26 Date d'inscription jeudi 30 juillet 2015 Statut Membre Dernière intervention 14 juin 2017 1
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à.
0
Utilisateur anonyme
14 juin 2017 à 21:55
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.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
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.
0
daminator25 Messages postés 3324 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 25 janvier 2020 308
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.
0
_Ritchi_ Messages postés 21288 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 11 novembre 2024 6 078
Modifié le 17 juin 2017 à 17:19
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
0