JS中,0.1 + 0.2 = 0.3?

171 阅读1分钟

今天在项目中无意中发现一个问题,后端返回的两个数据,一个是整数3,一个是浮点数30.24,我在前端将两个数相加后,发现结果并不是33.24 ,而是33.239999999999995

1、问题出现原因

为什么会出现这个问题呢,其实是在JS内部所有的计算都是以二进制方式计算的。  所以当运算 0.1+ 0.2 时要先把 0.1和 0.2 从十进制转成二进制,转成二进制后是无穷的,所以在运算中出现了精度丢失问题,导致最后结果不准确。

具体运算方法请看这里: 非科班前端人的一道送命题:0.1+0.2 等于 0.3 吗?

数据是这样的
image.png

相加后是这样的
image.png

2、 解决办法

    /**
     * 解决 两个浮点数相加或浮点数和整数相加后结果为无限循环小数,出现精度丢失
     */
    add(arr) {
      let fieldArr = []
      let filed = 0
      arr.forEach((item,i) => {
        try{
          filed = arr[i].toString().split('.')[1].length
        } catch(e) {
          filed = 0
        }
        fieldArr.push(filed)
      });

      let m = Math.pow(10, Math.max(...fieldArr));
      let add = 0
      arr.forEach((item)=>{
        add = add + item * m
      })
      
      let sum = Math.round(add) / m
      console.log(sum,"sum")
      return sum
    }