js 小数加法的精度问题解决(0.1+0.2 != 0.3,怎么解决?)

0.1+0.2 != 0.3,怎么解决?
(1) 在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。存储一个数值所使用的二进制位数比较多,这样得到的数会更加精确。
(2) 由于存储空间有限,无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。
(3) 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。
当然,有时两个近似值进行计算的时候,得到的值是在JS的近似范围内的,于是就可以得到正确答案。
(4) 解决办法:
就是我们想办法规避掉这类小数计算时的精度问题,那么最常用的方法就是将浮点数转化成整数计算。因为整数都是可以精确表示的。
对于0.1 + 0.02 我们需要转化成 ( 10 + 2 ) / 1e2
公共方法使用

      //默认传入的都是数字类型
      function commonAdd (number1, number2) {
            let result = 0;
            if (Number.isInteger(number1) || Number.isInteger(number2)) {
               result = number1 + number2;
            } else {
               //两个都是纯小数
               const number1Array = (number1).toString().split('.');
               const number2Array = (number2).toString().split('.');
               //最大的除数位数
               let maxBit = 1;
               if (number1Array[1].length >= number2Array[1].length) {
                  maxBit = number1Array[1].length + 1;
               } else {
                  maxBit = number2Array[1].length + 1;
               }
               const divisor = parseInt('1'.padEnd(maxBit, 0));
               result = (number1 * divisor + number2 * divisor) / divisor;
            }
            return result;
      }

参考文章1

你可能感兴趣的:(js 小数加法的精度问题解决(0.1+0.2 != 0.3,怎么解决?))