JavaScript解決浮點數算數運算精度問題

antzone發表於2018-07-03

JavaScript浮點數進行算數運算可能會產生誤差,下面就簡單介紹一下如何避免誤差的出現。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let a=0.1;
let  b=0.2;
console.log((a+b)==0.3);

以上程式碼看起來返回值為true應該是毫無疑問的,但是事實恰好相反。

計算機真正讀懂的是二進位制數字而不是十進位制數字,所以一切算數運算最後都要轉換為二進位制數字。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log((0.1).toString(2));
console.log((0.2).toString(2));

上面是轉換為二進位制的程式碼,其實輸出結果被截斷了,因為雙精度浮點數的小數部分最多支援 52 位,兩者相加之後得到這麼一串 0.0100110011001100110011001100110011001100110011001100 因浮點數小數位的限制而截斷的二進位制數字,這時候,我們再把它轉換為十進位制,就成了 0.30000000000000004。當然c#和java這樣的語言應該也有這樣的問題,只是它們進行了相關的封裝,所以程式設計人員就無需擔憂了。

解決方案:

既然浮點數計算可能出現問題,那麼就將浮點數轉換為整數,然後再進行相關操作就可以了。

程式碼如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var a=0.1;
var b=0.2;
console.log((a*10+b*10)/10==0.3);

以上程式碼實現了我們的要求,也詮釋瞭解決的原理。下面是一個通用程式碼:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
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);

相關文章