js中小数计算误差解决办法
js的小数计算根据二进制来计算,则对0.2这种无限循环的小数进行加减乘除的时候 会产生误差
下面是网上找的加减乘除的几个方法,原理是转换为整数计算 ,然后再复位
function accMul(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 accDiv(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){} with(Math){ r1=Number(arg1.toString().replace(".","")) r2=Number(arg2.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } } function accAdd(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 accSub(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 } 1 楼 colinzhy 2012-01-06 似乎这个accAdd函数计算仍然有误差啊,比如计算1.1+1.11的时候结果会出现2.210000000000004 2 楼 hhyyllgg 2012-01-06 colinzhy 写道似乎这个accAdd函数计算仍然有误差啊,比如计算1.1+1.11的时候结果会出现2.210000000000004我试了一下,确实如你所说,原因应该是小数在执行arg1*m+arg2*m在执行乘法的时候又产生误差,改为accMul(arg1,m)+accMul(arg2,m)就可以了