js运算精度问题
原理是,将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
原理示例:
将 console.log(1-0.8); 变为 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正确的值
根据上述原理,可以封装一些方法出来解决此类问题。如下所示(Math.pow(x, y);表示求x的y次方):
1 //加 2 function floatAdd(arg1,arg2){ 3 var r1,r2,m; 4 try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 5 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 6 m=Math.pow(10,Math.max(r1,r2)); 7 return (arg1*m+arg2*m)/m; 8 } 9 10 //减 11 function floatSub(arg1,arg2){ 12 var r1,r2,m,n; 13 try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 14 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 15 m=Math.pow(10,Math.max(r1,r2)); 16 //动态控制精度长度 17 n=(r1>=r2)?r1:r2; 18 return ((arg1*m-arg2*m)/m).toFixed(n); 19 } 20 21 //乘 22 function floatMul(arg1,arg2) { 23 var m=0,s1=arg1.toString(),s2=arg2.toString(); 24 try{m+=s1.split(".")[1].length}catch(e){} 25 try{m+=s2.split(".")[1].length}catch(e){} 26 return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); 27 } 28 29 30 //除 31 function floatDiv(arg1,arg2){ 32 var t1=0,t2=0,r1,r2; 33 try{t1=arg1.toString().split(".")[1].length}catch(e){} 34 try{t2=arg2.toString().split(".")[1].length}catch(e){} 35 36 r1=Number(arg1.toString().replace(".","")); 37 38 r2=Number(arg2.toString().replace(".","")); 39 return (r1/r2)*Math.pow(10,t2-t1); 40 }