解决javascript加减乘除及toFixed的误差问题

 1     //用于替换原有的toFixed,解决精度误差问题
 2     Number.prototype.myToFixed=function(s){
 3       if(s == null){s = 0;}
 4       var value = Math.pow(10,s);//Math.pow(x,y)返回 x 的 y 次幂的值,即10的len次方的值
 5       //javascript的加减乘除结果会有误差,使用自定义方法
 6       var returnStr = Math.round(this.mul(value)).div(value).toString();
 7       //var returnStr=(parseInt(this * value + 0.5)/ value).toString();
 8       var pointIndex = returnStr.indexOf(".");
 9       if(pointIndex < 0 && s > 0){//如果没有小数点,先添加小数点,再补0
10         returnStr = returnStr + ".";
11         for(i = 0; i < s; i++){
12           returnStr = returnStr + "0";
13         }
14       }else {
15         var weishu = returnStr.length - 1 - pointIndex;
16         for(i = 0; i < ( s - weishu ); i++){//如果有小数点,直接补缺少的0
17           returnStr = returnStr + "0";
18         }
19       }
20       return returnStr;
21     }
 1     //乘法函数,用来得到精确的乘法结果
 2     //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 3     //调用:accMul(arg1,arg2)
 4     //返回值:arg1乘以arg2的精确结果
 5     function accMul(arg1, arg2) {
 6         var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
 7         try { m += s1.split(".")[1].length } catch (e) { }
 8         try { m += s2.split(".")[1].length } catch (e) { }
 9         return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
10     }
11     //用法:
12     //给Number类型增加一个mul方法,调用起来更加方便。
13     Number.prototype.mul = function (arg) {
14         return accMul(this,arg);
15     }
 1     //除法函数,用来得到精确的除法结果
 2     //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 3     //调用:accDiv(arg1,arg2)
 4     //返回值:arg1除以arg2的精确结果
 5     function accDiv(arg1, arg2) {
 6         var t1 = 0, t2 = 0, r1, r2;
 7         try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
 8         try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
 9         with (Math) {
10             r1 = Number(arg1.toString().replace(".", ""))
11             r2 = Number(arg2.toString().replace(".", ""))
12             return (r1 / r2) * pow(10, t2 - t1);
13         }
14     }
15     //用法:
16     //给Number类型增加一个div方法,调用起来更加方便。
17     Number.prototype.div = function (arg) {
18         return accDiv(this,arg);
19     }
 1     //加法函数,用来得到精确的加法结果
 2     //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 3     //调用:accAdd(arg1,arg2)
 4     //返回值:arg1加上arg2的精确结果
 5     function accAdd(arg1, arg2) {
 6         var r1, r2, m;
 7         try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
 8         try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
 9         m = Math.pow(10, Math.max(r1, r2))
10         return (arg1 * m + arg2 * m) / m
11     }
12     //用法:
13     //给Number类型增加一个add方法,调用起来更加方便。
14     Number.prototype.add = function (arg) {
15         return accAdd(arg, this);
16     }
 1     //减法函数,用来得到精确的减法结果
 2     function Subtr(arg1, arg2) {
 3         var r1, r2, m, n;
 4         try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
 5         try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
 6         m = Math.pow(10, Math.max(r1, r2));
 7         //last modify by deeka
 8         //动态控制精度长度
 9         n = (r1 >= r2) ? r1 : r2;
10         return ((arg1 * m - arg2 * m) / m).toFixed(n);//这里竟然用了toFixed
11     }

计算尽量少在页面用js计算,尽量在后台计算,实在要用js又不想有误差,就可以上面的方法了。