OVH Cloud OVH Cloud

Flottant et résultat

12 réponses
Avatar
loiseauthierry
Bonjour,

Avec JavaScript, le résultat d'un calcul sur des flottants peut sembler
aberrant.

Ainsi, le résultat de :

10.2 - 4.3

retourne

5.8999999999999995

au lieu de

5.9

Je me dis alors qu'une simple calculatrice de poche à trois francs six
sous est bien plus performante... sauf que, en interne, une calculatrice
stocke plus de chiffres qu'elle ne le montre. Elle a en mémoire 16
chiffres (par exemple), mais n'affiche que 14 chiffres... en passant par
un arrondi.

Il suffit donc, pour le JavaScript, de faire quelque chose comme :

function simplifie(v) {
with (Math) {
v=(round(v*pow(10,14)))/pow(10,14);
}
return v;
}

a=10.2;
b=4.3;
c=a-b; // 5.8999999999999995
c=simplifie(c); // 5.9

c=a-b+0.000000007; // 5.900000006999999
c=simplifie(c); // 5.900000007

c=10.2-4.3+0.000000007; // 5.900000006999999
c=simpifie(10.2-4.3+0.000000007); // 5.900000007



Youpi ! Ça marche impeccable, y'a pas de bug... Quoi que !


Prenons un grand entier décimal.

a=100000000010.2;
b=4.3;
...

Là, du coup, il vaut mieux ne pas utiliser simplifie !!!

c=100000000010.2-4.3+0.000000007;

donne 100000000005.9

et

simplifie(c)

donne 100000000005.89998

Argh !

Il faut donc tenir compte du nombre de chiffres dans la partie entière
pour déterminer le nombre de chiffres dans la partie décimale à prendre
en compte pour l'arrondi. (je ne sais pas si je suis clair, là).

Déterminer le nombre de chiffre dans la partie entière :

Math.ceil( Math.log(c)/Math.log(10) )

On modifie donc la function simplifie()



----------------------------------------------------------------------
function simplifie(v) {
var n;
with (Math) {
n=ceil(log(c)/log(10));
v=(round(v*pow(10,15-n)))/pow(10,15-n);
}
return v;
}
----------------------------------------------------------------------



Qu'en pensez-vous ? Olivier ?

Thierry
--
* * __*__ *
* * * -----oOOo---°O°---oOOo------ * *
<http://astrophoto.free.fr> *
* * -------- oOOo oOOo -------- *

2 réponses

1 2
Avatar
Dr J R Stockton
En fr.comp.lang.javascript <1hwx12b.1p3yfud2bra8yN%
r>, 21 Apr 2007 10:28:05, Thierry Loiseau a
ecrit:

Avec JavaScript, le résultat d'un calcul sur des flottants peut sembler
aberrant.


Lisez s.v.p le FAQ de comp.lang.javascript, S 4.7, 4.6; et peut-etre
mon <URL:http://www.merlyn.demon.co.uk/js-maths.htm>.

S'il faut calculer exactement en sous, calculez en sous.

It's a good idea to read the newsgroup c.l.j and its FAQ. See below.

--
(c) John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v6.05 IE 6
news:comp.lang.javascript FAQ <URL:http://www.jibbering.com/faq/index.html>.
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Avatar
Dr J R Stockton
En fr.comp.lang.javascript message 22 Apr 2007
01:10:33, Olivier Miakinen <om+ a ecrit:

De retour au bureau je regarderai quand même la
norme ECMAScript pour voir s'il n'y a pas déjà une fonction d'affichage
qui arrondit à N chiffres significatifs


Il y en a, method toFixed, qui est buggy. Lisez s.v.p c.l.j. FAQ 4.6,
et, /via/ mon page Web <URL:http://www.merlyn.demon.co.uk/js-round.htm>,
js-rndg1.htm#GC

It's a good idea to read the newsgroup c.l.j and its FAQ. See below.

--
(c) John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v6.05 IE 6
news:comp.lang.javascript FAQ <URL:http://www.jibbering.com/faq/index.html>.
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

1 2