Petit coup de main en javascript

Fermé
Hugues Deriau - 8 mai 2002 à 21:25
 Marden - 10 mai 2002 à 12:42
en additionnant des variables, le résultat est parfois fantaisiste:
29,95 + 59,95 me donnent des trucs comme 90,0000000000001
y'a t-il une fontion pour ça, ou alors dois je me retrousser les manches et travailler sur les chaines ? ou alors quelqu'un de sympa a peut-être déjà du code ?

Merci !
Hugues
A voir également:

2 réponses

essaye d'utiliser les points au lieu de la virgule :)
29.95 + 59.95 au lieu de 29,95 + 59,95
bonne chance
0
je bosse dejà avec des points, je suis aux USA, apprement, ça fait pas grand chose. Merci !
0
Avec les valeurs d'opérandes indiquées, le résultat n'est pas, avec JS/IE, celui qui est annoncé ! Mais effectivement, pour certaines valeurs, l'effet constaté est réel. Ceci est dû au codage en binaire des nombres fractionnaires (voir discussion récente sur le sujet) : rechercher 0.5, 0.25, 0.125, ... dans un nombre, par soustarctions successives, ne donne pas forcément un résultat exact, pour un nombre fini de bits.
Il semble que JS fonctionne avec des réels en double précision (64 bits ?) correspondant à 16 chiffres significatifs (en décimal). Il m'est arrivé de rencontrer des erreurs de conversion implicite entier/réel de variable contenant 0. Avec la séquence : i=0 ; x=i ; if ( x .eq. 0.) ..., j'ai dû ajouter : if ( i .eq. 0 ) x = 0. parce que x valait 0.000...0001 !
Solution ?
Effectuer les additions en virgule fixes, c'est-à-dire sur des entiers, en alignant les 2 nombres sur la virgule (ou point décimal) avec ajout de "0" à droite pour celui dont le nombre de décimal est le plus court, en multipliant les valeurs par la puissance de 10 ad'hoc. Le résultat exact a le même nombre de décimales que l'opérande qui en a le plus. On doit ensuite diviser le résultat par le même multiplicateur, et supprimer les "0" à droite. Il peut y avoir dépassement de capacité, auquel cas la méthode n'est pas applicable. Il faut alors travailler en décimal (comme en Cobol, ou à la main) en écrivant ses propres fonctions, avec arrondi et troncature, sur des "chaînes". On peut aussi travailler avec un format intermédaire du genre (nnn nnn nnn . nnn nnn nnn), ce qui peut aider pour aligner les résultats de calculs à éditer sur une même colonne.
Pour les multiplications, le nombre de décimales du résultat est la somme des nombres de décimales des opérandes.
Certains langages (rexx, par exemple) utilisent une primitive de formatage, précisant le nombre de décimales à afficher (6 par défaut). Quand cette fonction n'existe pas, il faut se la programmmer. Il est parfois utile, en calcul scientifique, d'inclure le traitement du facteur 1000 (pour kilo, mega, giga, ... ou milli, micro, nano, pico, ...).
Bon courage !!!
0