Maison > Article > interface Web > Découvrez les raisons pour lesquelles les opérations sur valeurs à virgule flottante JavaScript génèrent des erreurs d'arrondi.
En JavaScript, les nombres entiers et les nombres à virgule flottante appartiennent au type de données Number (l'un des types de données simples). Nous constatons souvent que le résultat de l'impression d'un nombre à virgule flottante comme 1.0
. est 1
au lieu de 1.0
En effet, l'espace mémoire pour stocker les nombres à virgule flottante est deux fois supérieur à celui du stockage des valeurs entières, donc ECMAScript ne perdra pas de temps à convertir les nombres à virgule flottante en nombres entiers.
Bien que la situation ci-dessus rende un peu mal à l'aise les patients atteints de trouble obsessionnel-compulsif, ce n'est de toute façon pas une grosse erreur. La prochaine situation sera très effrayante. Par exemple, lorsque nous calculons 0.1
plus 0.2
, le résultat en sortie n'est pas 0.3
, mais 0.3000000000000004
. c'est quoi ce bordel ? ! Pour les enfants qui rencontrent cette situation pour la première fois, avez-vous le sentiment que votre vision du monde a été remise en question ?
J'ai donc rapidement ouvert le livre pour sauver mon âme et mon corps, et j'ai découvert que c'était clairement écrit dans le livre : ECMAScrip est basé sur le calcul numérique à virgule flottante IEEE754. Ce calcul numérique. La méthode convertira la valeur numérique en l'enregistrant au format binaire, puis effectuera des calculs. Étant donné que les nombres à virgule flottante sont infinis lorsqu'ils sont exprimés en binaire, des erreurs d'arrondi se produiront lors de l'exécution de calculs arithmétiques. les calculs de nombres à virgule flottante sont beaucoup moins précis que les calculs de nombres entiers, et rappelez-vous enfin de ne jamais tester la valeur d'un nombre à virgule flottante spécifique .
Les soi-disant prescrivent le bon médicament, une fois que vous connaissez la cause du problème, vous pouvez trouver la solution au problème. Puisqu'il s'agit d'une erreur causée par le fait que le système binaire de nombres à virgule flottante est infini, cette erreur n'existe pas dans les opérations sur les nombres entiers. Êtes-vous assez intelligent pour voir la vérité ? C'est vrai, il s'agit de convertir des nombres à virgule flottante en nombres entiers en ingénierie arithmétique, puis de convertir les résultats en nombres à virgule flottante. Officier invité, voici le nouveau code ~
1 //加法 2 function FloatAdd(arg1,arg2){ 3 var r1,r2,m; 4 try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数}; //参数1小数点后的位数5 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数6 m=Math.pow(10,Math.max(r1,r2)); //取其中较大的位数7 return (arg1*m+arg2*m)/m; //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数8 }
L'URL d'origine est jointe à la réimpression ci-dessus
La méthode
toFixed() devrait également être capable de gérer une partie du problème d'erreur d'arrondi de manière infaillible.
Syntaxe : number.toFixed(x) x : Spécifie le nombre de chiffres décimaux, qui est une valeur comprise entre 0 et 20, y compris 0 et 20. Certaines implémentations peuvent prendre en charge une plage numérique plus grande. Si ce paramètre est omis, 0 sera utilisé à la place.
FIN
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!