试过几个,经过改造,发现只有这个可靠些
Number.prototype.toFixed=function(len) {
var tempNum = 0;
var s,temp;
var s1 = this + "";
var start = s1.indexOf(".");
//截取小数点后,0之后的数字,判断是否大于5,如果大于5这入为1
if(s1.substr(start+len+1,1)>=5)
tempNum=1;
//计算10的len次方,把原数字扩大它要保留的小数位数的倍数
var temp = Math.pow(10,len);
//求最接近this * temp的最小数字
//floor() 方法执行的是向下取整计算,它返回的是小于或等于函数参数,并且与之最接近的整数
s = comm.accAdd( Math.floor( comm.accMul( this , temp)) , tempNum);
return comm.accDiv(s,temp);
}
其中comm.accAdd,comm.accMul,comm.accDiv
comm ={
/*
* 解决运算精度问题
*
*/
accDiv : function(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);
}
} ,
accMul : function(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)
} ,
accAdd : function(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
}
}