首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

js中小数计算误差解决方法

2012-09-04 
js中小数计算误差解决办法js的小数计算根据二进制来计算,则对0.2这种无限循环的小数进行加减乘除的时候 会

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)就可以了

热点排行