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