Javascript的計算精度問題
阿新 • • 發佈:2020-09-02
Javascript的計算精度問題,這個一不注意就容易對我們的專案產生或大或小的影響。所以我們需要了解下Javascript計算精度問題產生的原因 及一些解決辦法。
產生的原因
接下來我們看一個列子:
看到這裡,是不是有點和我們想的不一樣。這應該是相等,但為什麼不相等呢?
原來,在Javascript中 0.1 + 0.2 == 0.30000000000000004,這就是因為 Javascript的計算精度 而引起。 因為在計算 0.1+0.2 時,因為計算機能讀懂的是二進位制,所以計算機會將0.1和0.2轉化為二進位制。
解決方法
可以將其封裝成一個方法:
以上方法能適用大部分場景。也有侷限性,如果遇到科學計數法:2.3e+1 時還需要做處理。
資料展示類
當我們拿到類似於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; }