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 時還需要做處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM