Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.javascript > #3069
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Newsgroups | fr.comp.lang.javascript |
| Subject | Re: Formatage de nombre |
| Date | 2016-08-22 22:58 +0200 |
| Organization | There's no cabale |
| Message-ID | <npfp0p$137u$1@cabale.usenet-fr.net> (permalink) |
| References | <nocrhv$rgj$1@usenet.pasdenom.info> <57aa4592$0$7969$426a34cc@news.free.fr> <nodp6v$sj5$1@usenet.pasdenom.info> <npf0rb$bpf$1@cabale.usenet-fr.net> <npffhb$dn4$1@usenet.pasdenom.info> |
Le 22/08/2016 20:16, Gloops a écrit :
>>>
>>> Je m'étais figuré que 0.1 + 0.2 était la blague potache des créateurs de
>>> Javascript, et que pour le reste ils allaient se tenir à carreau.
>>
>> Ce n'est pas une blague, c'est juste le prix à payer quand on utilise
>> des nombres décimaux représentés sous forme binaire (représentation
>> IEEE754 sur 64 bits dans le cas de JavaScript).
>>
>> [...]
>
> Donc, on commet une erreur d'arrondi à la fin parce que la
> représentation n'en a pas :)
Euh... non. Ou alors je n'ai pas compris ce que tu veux dire.
Prenons un autre exemple plus simple, en supposant que la représentation
binaire a exactement 4 bits après la virgule (ce n'est pas comme ça que
fonctionne la norme IEEE754 mais on retrouvera le même problème).
Le premier bit après la virgule vaut 1/2 soit 0,5. Le second bit vaut
1/4 soit 0,25. Le troisième vaut 0,125 et le quatrième 0,0625. Du coup
les valeurs possibles entre 0 et 1 sont les suivantes :
binaire = décimal
0,0000 = 0
0,0001 = 0,0625
0,0010 = 0,125
0,0011 = 0,1875
0,0100 = 0,25
0,0101 = 0,3125
0,0110 = 0,375
0,0111 = 0,4375
0,1000 = 0,5
0,1001 = 0,5625
...
0,1111 = 0,9375
1,0000 = 1
Parmi les neuf valeurs décimales 0,1 ; 0,2 ; ... ; 0,9 seule 0,5 est
représentable exactement en binaire (c'est 0,1000) et toutes les
autres sont approchées. Par exemple, 0,1 en décimal est approchée au
mieux par 0,0010 en binaire qui vaut en réalité 0,125 en décimal :
0,0 <-> 0,0000 = 0
0,1 <-> 0,0010 = 0,125
0,2 <-> 0,0011 = 0,1875
0,3 <-> 0,0101 = 0,3125
0,4 <-> 0,0110 = 0,375
...
Regardons maintenant ce qui se passe quand on multiplie par 3 la
représentation binaire de 0,1 (0,0010 binaire qui vaut en réalité
0,125 en décimal). Le résultat est 0,0110 en binaire qui est la
représentation binaire de 0,4 en décimal (en réalité 0,375).
À cause des différences de représentations, on pourrait croire
que 3 × 0,1 = 0,4 alors que c'est seulement 3 × 0,125 = 0,375.
> Il n'y a que Javascript à faire le gag, ou je me trompe ?
Pas du tout. Ce « gag » comme tu dis concerne tous les systèmes de
représentation des nombres dans une base (ici la base 2) suffisamment
différente de celle d'affichage (en l'occurrence la base 10). Si tu
ne vois pas ce gag dans d'autres langages, par exemple en C, c'est
qu'ils arrondissent le résultat à quelques chiffres seulement avant
l'affichage.
Exemple en C, avec un affichage de 0,1 avec 6 chiffres après la
virgule, puis avec 50 chiffres après la virgule :
printf("%.6f\n", 0.1);
-> 0.100000
printf("%.50f\n", 0.1);
-> 0.10000000000000000555111512312578270211815834045410
> Je m'étais dit que j'allais consacrer une demi-journée à comprendre
> comment se bidouille cette affaire, mais ... il faut une demi-journée
> disponible :)
Si tu n'as pas le temps de comprendre ce qui se passe, alors au moins
retiens une chose : c'est qu'il ne faut pas faire de calculs avec des
nombres décimaux si tu peux les faire avec des nombres entiers -- cf.
mon exemple des euros et des centimes.
--
Olivier Miakinen
Back to fr.comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar
Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-09 17:06 +0200
Re: Formatage de nombre SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> - 2016-08-09 23:05 +0200
Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-10 01:21 +0200
Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-10 01:32 +0200
Re: Formatage de nombre Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 16:05 +0200
Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-22 20:16 +0200
Re: Formatage de nombre Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 22:58 +0200
Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-23 14:50 +0200
csiph-web