美文网首页
javaScript 小数计算精度丢失

javaScript 小数计算精度丢失

作者: 我没事_就是有点难受 | 来源:发表于2020-08-31 11:53 被阅读0次

    情景举例 : 有天对象问我一个问题,说前端计算有Bug,根据她的描述我抱着怀疑的态度去控制台试了试,写了一个220 /1.1,按下enter键一看,还真的有问题,计算结果居然是199.999999999997

    image

    为什么会是这样呢 ?抱着疑惑去各大知名网站搜了搜原因,大概就是说js运算

    image

    好吧 知道了问题的原因就想办法去解决他,既然小数转整数过程出现了问题,那就不能让计算中出现小数呀,于是乎就想到了把各种小数小数问题10来转化为最小整数计算,例如1.1 转化为最小整数就是1.1 * 1 * 10 = 11,220/1.1也就可以转化为:

    220 * 1 * 10 / 1.1 * 1 * 10 = 200
    ok, It`s beautiful ! 我们找到了解决的思路,对于运算我们涉及到加减乘除(+-*/),那干脆封装一个脚本来处理运算好了,emmmm开干

    一开始我写的版本

    image

    isFinite用来判断是否数字时又遇到坑了 isFinite(true) isFinite(null) isFinite('')也会返回true

    当我正想着用正则去校验数字时,对象说用typeOf()就可以了,我试了试还真是好使,都说写一个功能有多种方法,那当然是代码越简洁越好喽,学习长路慢慢而路途遥远,下面附上代码:

    /**

    • 计算,处理精确度丢失

    • @param {Number} arg1

    • @param {Number} arg2

    • @param {String} operator

    */

    export function calculationRender(arg1, arg2, operator) {

    if (operator === '/' && arg2 === 0) return;
    
    if (typeof (arg1) === 'number' && typeof (arg2) === 'number') {
    
      const precision1 = arg1.toString().split('.')[1] ? arg1.toString().split('.')[1].length : 0;
    
      const precision2 = arg2.toString().split('.')[1] ? arg2.toString().split('.')[1].length : 0;
    
      let maxPrecision = Math.max(precision1, precision2);
    
      maxPrecision = 10 ** maxPrecision;
    
      const num1 = arg1 * maxPrecision;
    
      const num2 = arg2 * maxPrecision;
    
      switch (operator) {
    
        case '+':
    
          return (num1 + num2) / maxPrecision;
    
        case '-':
    
          return (num1 - num2) / maxPrecision;
    
        case '*':
    
          return (num1 * num2) / (maxPrecision*maxPrecision);
    
        case '/':
    
          return num1 / num2;
    
        default:
    
          break;
    
      }
    
    }
    

    }

    相关文章

      网友评论

          本文标题:javaScript 小数计算精度丢失

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