javascript的浮点数在计算的时候会有精度问题,比如:19.49*100,你以为是1949,但实际上却是1948.9999999999998,这无疑会在工作共带来很多坑。
常用的计算无非四则运算:加减乘除。
加法:
理论上:0.1+0.2 = 0.3
实际上:0.1+0.2 = 0.30000000000000004
解决方法:
function accAdd(a,b){
var r1,r2,m;
try{r1=a.toString().split(".")[1].length}catch(e){r1=0}
try{r2=b.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (a*m+b*m)/m
}
减法:
理论上:0.8-0.6 = 0.2
实际上:0.8-0.6 = 0.20000000000000007
解决方法:
function accSub(a,b){
var r1,r2,m;
try{r1=a.toString().split(".")[1].length}catch(e){r1=0}
try{r2=b.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
n=(r1>=r2)?r1:r2;
return ((a*m-b*m)/m).toFixed(n)/1;
}
乘法:
理论上:19.49 * 100 = 1949
实际上:19.49 * 100 = 1948.9999999999998
解决方法:
function accMul(a,b){
var m=0,s1=a.toString(),s2=b.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)
}
除法:
理论上:33.6/6 = 5.6
实际上:33.6/6 = 5.6000000000000005
解决方法:
function accDiv(a,b){
var t1=0,t2=0,r1,r2,bit;
try{t1=a.toString().split(".")[1].length}catch(e){}
try{t2=b.toString().split(".")[1].length}catch(e){}
r1=Number(a.toString().replace(".",""))
r2=Number(b.toString().replace(".",""))
return accMul(r1/r2, Math.pow(10,t2-t1));
}
转载请注明带链来源:春语精椿