日期:2014-05-16  浏览次数:20419 次

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