美文网首页
JS浮点数计算精度

JS浮点数计算精度

作者: RadishHuang | 来源:发表于2021-08-25 11:16 被阅读0次

    JS的浮点数,计算都是会有问题的。下面给出加减乘除的解决办法

    • 131.20*100 = 13119.999999
    • 0.1+0.2 = 0.3000000000004
    • 1.2/12 = 0.099999999999
    • 0.4-0.1= 0.30000000000004
    
    export const accAdd = (arg1, arg2) => {
      // 增加浮点数计算方法
      let 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 (accMul(arg1, m) + accMul(arg2, m)) / (m * 1.0)
    }
    export const accMul = (arg1, arg2) => {
      // 增加浮点数的相乘方法
      var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
      try {
        m += s1.split('.')[1].length;
      } catch (e) {
        // ee
      }
      try {
        m += s2.split('.')[1].length;
      } catch (e) {
        //e
      }
      return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m);
    }
    export const accDiv = (arg1, arg2) => {
      var t1 = 0,
        t2 = 0,
        r1,
        r2;
      try {
        t1 = arg1.toString().split('.')[1].length;
      } catch (e) {
        // e
      }
      try {
        t2 = arg2.toString().split('.')[1].length;
      } catch (e) {
        // e
      }
      r1 = Number(arg1.toString().replace('.', ''));
      r2 = Number(arg2.toString().replace('.', ''));
      return (r1 / r2) * Math.pow(10, t2 - t1);
    }
    
    export const 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));
      //last modify by deeka
      //动态控制精度长度
      n = (r1 >= r2) ? r1 : r2;
      return ((accMul(arg1, m) - accMul(arg2, m)) / (m * 1.0)).toFixed(n);
    }
    
    
    

    相关文章

      网友评论

          本文标题:JS浮点数计算精度

          本文链接:https://www.haomeiwen.com/subject/siesiltx.html