Maison  >  Article  >  interface Web  >  Comment résoudre le problème des décimales multiples dans l'opération décimale js

Comment résoudre le problème des décimales multiples dans l'opération décimale js

PHPz
PHPzoriginal
2016-05-16 15:37:212825parcourir

Concernant le problème des décimales multiples lors de l'ajout, de la soustraction, de la multiplication et de la division de décimales en JavaScript, je l'ai étudié moi-même et j'ai effectué des tests pertinents. J'ai acquis de nombreux points de connaissances. Les amis dans le besoin peuvent s'y référer.

Laissez-moi partager avec vous un test intéressant :

0,1 0,2 == 0,3 //faux
J'étais soudainement déprimé, d'accord ! Il s'avère que 0,1 0,2 devient : 0,30000000000000004
Un autre 2,4/0,8 => 2,99999999999999996 Il n'y a aucun moyen de le changer, et de le convertir en un entier (2,4 * 100)/(0,8 * 100)
10,22 Maintenant, nous besoin de soustraire 0,11 pour obtenir le résultat Il y avait beaucoup de décimales dans la valeur, 10,110000000000001, puis j'ai utilisé la méthode toFixed pour filtrer les décimales, mais je ne sais pas laquelle est la plus efficace que la méthode précédente de conversion en un entier puis l'exécuter. Bon ! Essayons à nouveau !

var date1 = new Date();
for(var i = 0; i < 10000; i++){
 var result1 = (10.22 - 0.11).toFixed(2);    
}
alert(new Date() - date1);//效率低
  
var date2 = new Date();
for(var j = 0; j < 10000; j++){
 var result2 = (10.22 * 1000 - 0.11 * 1000) / 1000;    
}
alert(new Date() - date2);//效率高
 
alert(0.1 + 0.2 == 0.3); //既然返回false
alert(0.1 + 0.2); //既然返回0.30000000000000004
alert(parseFloat(0.1) + parseFloat(0.2)); //还是返回0.30000000000000004

J'ai vérifié certaines informations, l'une est un bug dans le calcul en virgule flottante JavaScript, et l'autre est liée à la conversion finale de l'ordinateur en calcul binaire, mais pourquoi pas toutes les décimales. Ce phénomène se produira toujours. Je ne le connais pas encore, je l'étudierai en profondeur quand j'aurai le temps.

Solution :
Il existe deux façons de résoudre ce problème. La première consiste à utiliser la méthode toFixed(n) de JavaScript pour obtenir directement N décimales. , cependant, je pense personnellement que cette méthode posera certains problèmes en termes d'exactitude des données. Il peut être utilisé si les exigences en matière de précision des données ne sont pas élevées.

alert((0.1 + 0.2).toFixed(1));

La deuxième méthode consiste à écrire vous-même la méthode de calcul. Ce qui suit est une fonction d'ajout personnalisée. L'utilisation de cette méthode d'addition évitera les problèmes ci-dessus.

//自定义加法运算
function addNum (num1, num2) {
 var sq1,sq2,m;
 try {
  sq1 = num1.toString().split(".")[1].length;
 }
 catch (e) {
  sq1 = 0;
 }
 try {
  sq2 = num2.toString().split(".")[1].length;
 }
 catch (e) {
  sq2 = 0;
 }
 m = Math.pow(10,Math.max(sq1, sq2));
 return (num1 * m + num2 * m) / m;
}
alert(addNum(0.1, 0.2));

Bien sûr, cela peut aussi s'écrire simplement comme : alert((num * 3 10 * 3) /3) ; les lieux n'apparaîtront pas.
alert((num * 3 10 * 3) /3); et alert(num 10); Il y a une différence entre ces deux méthodes d'écriture lorsque l'ordinateur les convertit en opérations binaires au niveau inférieur. raison du problème ci-dessus, ou nous devons l'étudier en profondeur et vous pourrez en discuter davantage.

Ce qui précède représente l'intégralité du contenu de ce chapitre. Pour plus de didacticiels connexes, veuillez visiter le Tutoriel vidéo JavaScript !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn