javascript小数点的四则运算精度丢失处理

js在进行小数点的四则运算,结果可能会出现有偏差,看以下几个例子:

 console.log(0.1 + 0.2);  //0.30000000000000004
 console.log(-0.09999999 - 0.00000001); //-0.09999999999999999
 console.log(0.012345 * 0.000001); //1.2344999999999999e-8
 console.log(0.000001 / 0.0001); //0.009999999999999998

所以我们得做一下封装处理,看一下代码:

function Handle(num,type,num2) {
      if(num2) {
        this.total = num2;
      }
      let wrapObj = {
        '+': this.add,
        '-': this.sub,
        '*': this.mul,
        '/': this.div
      }
      wrapObj[type].call(this,num);
    }
    Handle.prototype.add = function(num) {  //加法
      let getArr = this.getDoubleVal(num);
      this.total = (getArr[0] + getArr[1]) / (Math.pow(10,Number(getArr[2])));
      return this;
    }
    Handle.prototype.sub = function(num) {   //减法
      let getArr = this.getDoubleVal(num);
      this.total = (getArr[0] - getArr[1]) / (Math.pow(10,Number(getArr[2])));
      return this;
    }
    Handle.prototype.mul = function(num) {   //乘法
      let getArr = this.getDoubleVal(num);
      this.total = (getArr[0] * getArr[1]) / (Math.pow(10,getArr[2] *getArr[2]));
      return this;
    }
    Handle.prototype.div = function(num) {    //除法
      let getArr = this.getDoubleVal(num);
      this.total = (getArr[0]/getArr[1]);
      return this;
    }
    Handle.prototype.judgeLeng = function(val) {
        val = String(val);
        let valArr = val.split('.');
        if(valArr.length > 1) {
          return valArr[1].length;
        }else {
          return 0;
        }
    }

    Handle.prototype.getDoubleVal = function(num) {
      let firL = this.judgeLeng(this.total);
      let secL = this.judgeLeng(num);
      let del = firL - secL >= 0 ? firL : secL;
      let firVal = this.total * Math.pow(10,del);
      let selVal = num * Math.pow(10,del);
      return [firVal,selVal,del];
    }
    Handle.prototype.result = function(val) {     //获取结果
      return this.total;
    }

以上我们封装了一个构造函数Handle,其中的思路就是先把小数放大成整数,进行四则运算,然后把结果根据放大的关系比例缩回去,得到正确的结果。通过封装,我们可以使用链式的方式进行四则运算,我们来使用下,
栗子一:
做一个 0.1 + 0.2的加法运算
new Handle(0.1,"+",0.2).result(); //0.3
栗子二:
(0.1 + 0.2) *100/10的运算:
new Handle(0.1,"+",0.2).mul(100).div(10).result(); //30

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值