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!