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

原理介绍:

https://juejin.cn/post/6844903974336724999

 

小数计算误差

  1. 先乘以小数点位数,计算后再除以位数
  2. 转字符串
//加法
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 (Math.round(arg1*m)+Math.round(arg2*m))/m
}
//减法
function accSub(arg1,arg2){
    var r1,r2,m,n;
    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));
    n=(r1>=r2)?r1:r2;
    return ((arg1*m-arg2*m)/m).toFixed(n);
}
//乘法
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 accMul((r1/r2),pow(10,t2-t1));
    }
}

toFixed() xx.5误差

//toFixed精度解决
Number.prototype.toFixed = function(s) {
    var changenum=(parseInt(this * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();
    var index=changenum.indexOf(".");
    if(index<0&&s>0){
        changenum=changenum+".";
        for(i=0;i<s;i++){
            changenum=changenum+"0";
        }

    }else {
        index=changenum.length-index;
        for(i=0;i<(s-index)+1;i++){
            changenum=changenum+"0";
        }

    }
    return changenum;
}
 
原文地址:https://www.cnblogs.com/porter/p/15095104.html