js中的加减乘除运算方法(修复丢失精度问题)

js中的加减乘除运算方法

开发中常常会遇到价格的计算,前端的计算方法有很多,在这里总结一下,并且说一下存在的问题!下面给出两种方法,不过个人比较推荐第一种方法,清晰明了!谷歌浏览器下第二种方法可能会丢精度,第一种方法可避免这个错误,方法1是自己实践和使用最多的,比较成熟,没啥问题!如果发现问题的可以指出来,谢谢阅读。

第一种计算方式如下:

function decNum(a){/*获取小数位数*/
    var r=0;
	if(!isNull(a)){
		a=a.toString();
		if(a.indexOf(".")!== -1) r=a.split(".")[1].length;
	}
    return r;
}
function int(a){/*去除小数点并转成数值*/
	if(!isNull(a)){
		if(Number(a)==0){
			return parseInt("0");
		}else{
			return parseInt(a.toString().replace(".",""));
		}
	}else{
		return parseInt("0");
	}
}
function calc(a,b,type){//加减乘除
    var r,
        da=decNum(a),
        db=decNum(b),
        dsum=da+db,
        dmin=Math.min(da,db),
        dmax=Math.max(da,db);
    dsum+=dmax-dmin;
    dsum=Math.pow(10,dsum);
    dmax=Math.pow(10,dmax);
    a=int(a);
    b=int(b);
    if(da>db){
        b*=Math.pow(10,da-db);
    }else{
        a*=Math.pow(10,db-da);
    }
    switch(type){
        case "add":
            r=(a+b)/dmax;
            break;
        case "subtract":
            r=(a-b)/dmax;
            break;
        case "multiply":
            r=(a*b)/dsum;
            break;
        case "divide":
            r=a/b;
            break;
    }
    return r;
}

调用的方法为:

s=calc(0.11,0.21,"add");
s=calc(-0.12,0.23,"add");
s=calc(0.21,0.3,"subtract");
s=calc(0.005,0.01,"multiply");
s=calc(2.2,100,"divide");

这个方法有参考别的计算方法,并做了优化,之前别的人的方法如果是存在 s=calc(0,0.2,"add"),会计算出错,固int(a)方法做了修复操作!

第二种方法:

//加    
function floatAdd(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;    
}
//上面方法两位数相加在谷歌浏览器里有可能丢失精度,可选择下面这个方法floatAddtoFixed(arg1,arg2,num)
function floatAddtoFixed(arg1,arg2,num){    
	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 toFixed((arg1*m+arg2*m)/m,num);    
}
   
//减    arg1 被减数 ,arg2 减数
function floatSub(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);    
}    
       
//乘  arg1 被乘数 ,arg2 乘数,arg3 保留位数   
function floatMul(arg1,arg2,arg3)   {     
    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)).toFixed(arg3);     
}     
      
      
//除   arg1 被除数 ,arg2 除数,arg3 保留位数   
function floatDiv(arg1,arg2,arg3){     
      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){}     
        
      r1=Number(arg1.toString().replace(".",""));  
   
      r2=Number(arg2.toString().replace(".",""));     
      return ((r1/r2)*Math.pow(10,t2-t1)).toFixed(arg3);     
} 

//toFixed 修复
function toFixed(num, s) {
    var times = Math.pow(10, s)
    var des = num * times + 0.5
    des = parseInt(des, 10) / times
    return des + ''
}

第二种方法直接按需调用即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值