Javascript的计算精度问题

Javascript的计算精度问题,这个一不注意就容易对我们的项目产生或大或小的影响。所以我们需要了解下Javascript计算精度问题产生的原因 及一些解决办法。
 
产生的原因
  接下来我们看一个列子:  
  
  看到这里,是不是有点和我们想的不一样。这应该是相等,但为什么不相等呢?
  
原来,在Javascript中 0.1 + 0.2 == 0.30000000000000004,这就是因为 Javascript的计算精度 而引起。 因为在计算 0.1+0.2 时,因为计算机能读懂的是二进制,所以计算机会将0.1和0.2转化为二进制。
 
  
 
解决方法

  数据展示类

当我们拿到类似于0.30000000000000004这样的数据时,可以使用 toPrecision() 方法凑整后用 parseFloat() 方法转化为数字后再显示。
        console.log(parseFloat((0.1 + 0.2).toPrecision(12)) === 0.3);  // true
      
  可以将其封装成一个方法:
        function strip(num,precision = 12) {
               return parseFloat(num,toPrecision(precision))
            }
      
  对于选用12作为默认精度,是因为能解决掉大部分的0001和0009这样的问题,大部分情况下够用了,当然也可以 传入想要的精度。

  数据运算类

对于运算类操作,如 +-*/ ,就不能使用 toPrecision 了。可以把小数转化为整数后再运算。如加法:
        function add(num1,num2){
               const num1Digits = (num1.toString().split(".")[1] || "").length;
               const num2Digits = (num2.toString().split(".")[1] || "").length;
               const baseNum = Math.pow(10,Math.max(num1Digits,num2Digits));
               return (num1 * baseNum + num2 * baseNum) / baseNum;
            }
      
  以上方法能适用大部分场景。也有局限性,如果遇到科学计数法:2.3e+1 时还需要做处理。
posted @ 2020-09-02 20:48  攻城Alone  阅读(1912)  评论(0编辑  收藏  举报