[JavaScript] 3 * 6.4 = 19.200000000000003

3 * 6.4 = 19.200000000000003 [JavaScript] - Programmation

Marsh Posté le 12-02-2001 à 16:56:41    

Quelle est la méthode pour arrondir un chiffre en javascript ?(si elle existe)
 
En effet, dans une de mes fonctions javascript, lors du calcul de 3 * 6.4 j'obtiens ceci 19.200000000000003, une ame charitable poue me tirer de ce faux pas.


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 12-02-2001 à 16:56:41   

Reply

Marsh Posté le 12-02-2001 à 17:13:37    

il me semble qu'avec un cast, ca doit marcher, mais jai jamais essaye:m
x=(int)6.4*3

Reply

Marsh Posté le 12-02-2001 à 17:18:09    

Cthulhu> Tu essaies de me regonfler le moral en ce debut de semaine en me faisant rire aux larmes ?
G précisé que mon langage de "programmation" etait javascript. Par contre je vais préciser le résultat de l'opération qui est 19.2 et oui donc qui ne peut etre un int.


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 12-02-2001 à 17:21:01    

ok, excuse moi, pour moi aussi , c'est le début de la semaine...
mais je dois dire que moi meme en relisant mon post jai verse une petite larme...mais pas de rire ;)

Reply

Marsh Posté le 12-02-2001 à 17:27:06    

Tu dois savoir à combien de décimales tu veux arrondir, non?
Alors si tu dois arrondir à un dixième près, tu peux toujours faire:
x=Math.round(10*6.4*3)/10;
Bien sûr, c'est artisanal, mais tu peux toujours faire une belle fonction toi-même du genre:
arrondi(trucaarrondir,nbdecimales)
{
return Math.round(pow(10,nbdecimales)*6.4*3)/pow(10,nbdecimales)*;
}

Reply

Marsh Posté le 12-02-2001 à 17:34:10    

Bon, voilà la version relue et corrigée qui marche...
 
 
function arrondi(trucaarrondir,nbdc)  
{  
  alert(Math.round(Math.pow(10,nbdc)*trucaarrondir)/Math.pow(10,nbdc));  
}  
 
Tout le monde peut se tromper, ça va!

Reply

Marsh Posté le 12-02-2001 à 17:37:07    

Toucouch,  :D plus rien à taper juste copier coller. C merveilleux.
 
Par contre est ce que ce probleme est du à IE5.xx sous windows, ... est ce un bug repertorié .... ?
 
Merci


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 12-02-2001 à 17:40:53    

nabab a écrit a écrit :

 
Par contre est ce que ce probleme est du à IE5.xx sous windows, ... est ce un bug repertorié .... ?




 
Alors là, désolé, mais tu m'en demandes trop!
 
Au plaisir...

Reply

Marsh Posté le 12-02-2001 à 17:56:22    

Au plaisir ...


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 12-02-2001 à 19:09:48    

Wow, ca fait quand meme peur un bug comme ca.
 
----------------------------
Plus tu pedales moins vite
Moins tu avances plus vite

Reply

Marsh Posté le 12-02-2001 à 19:09:48   

Reply

Marsh Posté le 12-02-2001 à 22:17:02    

C'est pas un bug...
 
C'est l'unité de virgule flottante des CPU qui sont foireuses...
 
C'est pour ça que dans les jeux kla virgule flottante pêche énormément, car le développeur doit préciser de faire les calculs selon différentes méthodes afin de ne pas avoir de résultats à la con..
 
Essaie ton script sur un AMD, un Cyrix et un Intel, tu va avoir des résultats différents (sisi, je t'assure)
 
Celà viens de la manière de calculer les virgules flottantes en binaire... Il se produit une erreur inévitable...
 
C'est ensuite aux développeurs de palier à cette erreur.
 
Certains compilos/interpréteurs font le boulot de corerction d'erreur à ta place (VB, certains compilos de C, etc.) mais d'autres pas.

Reply

Marsh Posté le 13-02-2001 à 08:41:14    

C ahurissant quand meme de declencher ce type d'erreur en javascript sur une    multiplication .
Mais je commencais à proclamer que j'avais reussi à mettre à jour le probleme de la virugle flottante propre à INTEL mais mon ton etait ironique. MagiBuzz apporte une nouvelle vision des pIII (pIII600EB), je n'en reviens pas que l'on arrive à tomber ds le syndrome INTEL CL en faisant juste une multiplication à 2 chiffres. Il faut à tout prix que j'arrive à trouver un papier dessus, car j'ai quand meme du mal à le croire qu' un simple 3*6.4 peut etre aussi devastateur ....
 
 
Merci


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 08:46:07    

on doit rire ou pleurer en lisant un tel post ?

Reply

Marsh Posté le 13-02-2001 à 08:50:39    

Ben le mieux c que l'on expose sa config et si on a eu aussi le probleme.
 
Windows 2000 Server PIII 600 EB IE5.5  
--->3 * 6.4 = 19.200000000000003


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 08:53:43    

Coté serveur il n'y a pas de probleme, j'ai fiat une page ASP en utilisant VBScript et JScript aucun probleme du cote serveur ....


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 09:04:26    

Un petit test online ----> http://siteavie.com/nabab/test.htm


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 11:46:07    

Bon , ben j'ai essaye le lien et moi aussi j'ai l'erreur :
Netscape 4.6.1 sous HP...

Reply

Marsh Posté le 13-02-2001 à 11:51:56    

HP avec processeur INTEL ? Quel OS ?


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 11:53:10    

Station HP sous HP-UX, processeur RISC HP, HP quoi...

Reply

Marsh Posté le 13-02-2001 à 12:00:27    

Donc cela approche plus d'une erreur du au langage Script JavaScript que des processeurs. A mois que RISC et INTEL utilisent les memes instructions ....


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 15:14:08    

Cette erreur se produit également avec Opera 5, pour une fois que tous les navigateurs ont le meme comportement  :D


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 15:52:39    

Dans ma conquete du maikessekilsepasse j'ai essaye ceci :
 
Math.exp(Math.log(3)+Math.log(6.4))
 
Et qu'est ce que cela donne d'apres vous ?

 

--Message édité par nabab--


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 16:11:45    

Derniere news empirique >> 3*xx.xx un des champs doit avoir le bit 4 à 1 pour que cela deconne ....


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 17:08:30    

l'erreur est la même sous IE 5.5 et NS 3.0 sur un Bi-PII
 
Pour info, l'erreur est la même avec BASIC.
 
Ben oui...
 
C'est pas nouveau.
 
Et je vous affirme que celà ne vient pas de JavaScript ou Basic qui sont buggés, mais des procs qui ne font que des approches lorsqu'ils font des calculs en virgule flottante.

Reply

Marsh Posté le 13-02-2001 à 17:33:08    

Apres moult recherche et un post sur un forum de microsoft qui s'est avéré fructueux en recherche cela est du comme guru et moi meme l'avions supposé à la représentation binaire des nombres. En effet des nombres decimaux finis en javascript peuvent devenir "infinis" à decimales redondantes (cycliques) par le systeme binaire employé par javascript comme vous pouvez le lire à cette adresse :  
http://jibbering.com/faq/#_47 puis la section 4.6
 
donc MagicBuzz je n'argumente aucunement une position qui serait à ton encontre car le systeme binaire employé par javascript depend de toute maniere des processeurs employés pour le faire tourner mais ce que je veux dire c que cette erreur en elle meme est propre au langage script car elle n'est pas présente dans tous les langages ......


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 13-02-2001 à 17:59:34    

nabab > Bon, OK, dans l'absolu, tu as raison.
 
Mais sâche que ce phénomène se produit avec tout les langages... Mais souvent, le compilateur rajoute des instructions permettant de débarasser les variables utilisateurs de ces résidus. (notament VB)
 
Et deplus, il est reproduit au niveau du CPU. En assembleur, tu a les même erreures, même si pourtant tu n'a rien fait de particulier.
 
On avait mis en évidence ce truc en TP, avec des Pentium 90 (non buggés) Et on autrait pu faire ce même TP avec un Mac ou un Dec Alpha, on aurait eu le même problème.
 
C'est pour celà que j'ai pensé un peut trop vite, certes à cette solution. Enfin... De toute façon, le problème reste le même :D faut que tu tronques afin de te débarrasser des chiffres non significatifs ;)

Reply

Marsh Posté le 13-02-2001 à 18:30:14    

MagicBuzz ok tu as raison mais ...  :D Je deconne Et en effet les langages la plupart du temps palient cette erreur ...
Sinon merci en tout cas à Toucouch qui dés le début avait proposer une solution qui se revele la seule disponible .... et sinon à tous les autres forumeurs qui ont aidé à mettre en avant les problèmes de la virgule flottante que nous pouvons dans des instructions aussi simpliste ...


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed