zoukankan      html  css  js  c++  java
  • 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 时还需要做处理。
  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/aloneer/p/13604079.html
Copyright © 2011-2022 走看看