關於JS的浮點數計算精度問題解決方案

local0發表於2021-09-09

由於接觸JS不久,關於JS的浮點數的計算更是之前沒有用過,這次寫JS專案發現的這個問題:0.1+0.2=0.3000000000004,為什麼會出現這麼奇怪的問題呢 ?在網上找了一些資料,JS作為解釋性語言,直接計算會有浮點數精度丟失問題。 門弱型別語言的JavaScript ,從設計思想上就沒有對浮點數有個嚴格的資料型別。

解決方案:
一. 有種最簡單的解決方案,就是給出明確的精度要求,在返回值的過程中,計算機會自動四捨五入,比如:

var numA = 0.1; 
var numB = 0.2; 
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );

用這種方法在測試過程中也有問題,例如6.8-0.4列印為6.3,本應為6.4所以這裡轉換結果還是不正確。
在浮點數計算的時候,很多時候產生的都是這種極限資料,如果要精確進行整數轉換,要放大的倍數過大。這裡我們可以用四捨五入對轉換的過程進行最佳化:

Math.round((6.8-0.9)*10);//四捨五入59

最佳化之後的自定義函式:

Math.formatFloat = function(f, digit) { 
    var m = Math.pow(10, digit); 
    return parseInt(f * m, 10) / m; 
} 
var A = 0.1; 
var B = 0.2;console.log(Math.formatFloat(A + B, 1) === 0.3);

因此,為了避免產生精度差異,我們要把需要計算的數字乘以 10 的 n 次冪,換算成計算機能夠精確識別的整數,然後再除以 10 的 n 次冪,大部分程式語言都是這樣處理精度差異的,我們就借用過來處理一下 JS 中的浮點數精度誤差。



作者:honey緣木魚
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/132/viewspace-2814414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章