Maison >interface Web >js tutoriel >js implémente un calcul précis des opérations arithmétiques

js implémente un calcul précis des opérations arithmétiques

不言
不言original
2018-07-17 15:55:056889parcourir

Un calcul précis est crucial pour un projet, alors comment réaliser un calcul précis des opérations arithmétiques en js ? L'article suivant partagera avec vous le calcul précis mis en œuvre par js.

Bogue empêchant JS d'effectuer des calculs précis.

Lorsque vous travaillez sur le CRM, les exigences de révision de deuxième génération examinent la page de détails. Les nombres saisis par l'utilisateur doivent être affichés à différents endroits en proportion (le backend passe une décimale comme 0,8).
Un problème a été trouvé lors de l'exécution de dubheInvest = invest * (1 - ratio); Les détails sont les suivants :
Exemple de code :

console.log( 1 - 0.8 );  //输出 0.19999999999999996 
console.log( 6 * 0.7 );  //输出 4.199999999999999 
console.log( 0.1 + 0.2 );  //输出 0.30000000000000004 
console.log( 0.1 + 0.7 );  //输出 0.7999999999999999 
console.log( 1.2 / 0.2 );  //输出 5.999999999999999

Comme vous pouvez le voir dans les exemples ci-dessus, les résultats de l'opération js natif ne sont pas nécessairement précis et perdront en précision.
Solution

Le principe de la solution est de multiplier (développer) le nombre à virgule flottante par 10 à la nième puissance, de convertir le nombre à virgule flottante en un entier puis d'effectuer l'opération correspondante, et enfin obtenir le résultat Divisez (réduisez) 10 à la nième puissance.
Exemple de principe :

Changez console.log(1-0.8); en console.log((1 * 10 - 0.8 * 10) / 10) pour obtenir la valeur correcte
Basé sur En fonction des principes ci-dessus, certaines méthodes peuvent être résumées pour résoudre de tels problèmes. Comme indiqué ci-dessous (Math.pow(x, y); signifie trouver la yème puissance de

//加法运算    
function floatAdd(arg1,arg2){    
     var r1,r2,m;    
     try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}    
     try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}    
     m=Math.pow(10,Math.max(r1,r2));    
     return (arg1*m+arg2*m)/m;    
}    
      
//减法运算    
function floatSub(arg1,arg2){    
    var r1,r2,m,n;    
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}    
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}    
    m=Math.pow(10,Math.max(r1,r2));    
    //动态控制精度长度    
    n=(r1>=r2)?r1:r2;    
    return ((arg1*m-arg2*m)/m).toFixed(n);    
}    
       
//乘法运算    
function floatMul(arg1,arg2)   {     
    var m=0,s1=arg1.toString(),s2=arg2.toString();     
    try{m+=s1.split(".")[1].length}catch(e){}     
    try{m+=s2.split(".")[1].length}catch(e){}     
    return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);     
}     
      
      
//除法运算  
function floatp(arg1,arg2){     
      var t1=0,t2=0,r1,r2;     
      try{t1=arg1.toString().split(".")[1].length}catch(e){}     
      try{t2=arg2.toString().split(".")[1].length}catch(e){}     
        
      r1=Number(arg1.toString().replace(".",""));  
   
      r2=Number(arg2.toString().replace(".",""));     
      return (r1/r2)*Math.pow(10,t2-t1);     
}

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!

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