1. 程式人生 > 實用技巧 >Javascript的計算精度問題

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