2 votes

Problème js toFixed ?

Number(123.456).toFixed(20)

émet

"123.45600000000000306954"

D'où vient le 306954? Je sais que les nombres représentés en binaire ne peuvent pas être précis. Mais je n'ai trouvé aucune mention dans la documentation indiquant que l'appel à number(/.../) entraînerait une perte de précision.

mdn dit

Une représentation en chaîne de caractères du nombre qui n'utilise pas la notation exponentielle et qui a exactement des chiffres après la virgule. Le nombre est arrondi si nécessaire, et la partie fractionnaire est rembourrée de zéros si nécessaire pour qu'elle ait la longueur spécifiée. Si le nombre est supérieur à 1e+21, cette méthode appelle simplement Number.toString() et renvoie une chaîne en notation exponentielle

edit

toFixed renvoie un point fixe et non un point flottant ... enter image description here

3voto

Andrzej Doyle Points 52541

Cela a entièrement à voir avec la représentation en virgule flottante des nombres décimaux.

Les ordinateurs ne peuvent pas représenter 123.456 exactement, donc le nombre binaire le plus proche est utilisé à la place.

Voir le guide sur les nombres flottants, ou pour plus de détails Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante.

Conformément au premier lien, il n'y a pas de solution intégrée (c'est-à-dire un type décimal) en Javascript. Il existe une version de la classe BigDecimal de Java disponible, si cela pose réellement un problème pour vous plutôt que simplement par curiosité.

Réponse à l'édition : Ce n'est pas un problème avec Number. Dans votre exemple fonctionnel, vous déclarez un littéral entier (123) - ceux-ci peuvent être représentés exactement. Dans votre exemple défaillant, vous utilisez un littéral en virgule flottante 123.456, qui, au moment où il est traité par l'exécution, sera représenté par une séquence de chiffres binaires qui ne sont pas exactement 123.456.

Le problème vient des littéraux en virgule flottante, pas de Number en soi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X