2012-07-01 25 views
-3

可能重複:
Javascript Math Error: Inexact Floats的Javascript中加入0.1〜0.2的原因0.30000000000000004

我有以下的代碼,以使一個動畫(doIt方法做動畫,但不相關)。

function recur(max, i){ 
    console.log("i: " + i); 
    if (i <= 1){ 
     setTimeout(function(){ 
      // doIt(max,i); 
      recur(max, i + 0.1);     
     },100); 
    } else { 
     // OK 
    } 
} 
recur(16,0); 

但是,i值不一致。對於下面的代碼輸出是(Google Chrome 20):

i: 0 
i: 0.1 
i: 0.2 
i: 0.30000000000000004 
i: 0.4 
i: 0.5 
i: 0.6 
i: 0.7 
i: 0.7999999999999999 
i: 0.8999999999999999 
i: 0.9999999999999999 
i: 1.0999999999999999 

爲什麼會發生這種情況?我想0.3不是那麼接近的數字。不幸的是,這發生在每一次迭代中。

+1

的問題出現了幾分鐘前太(答案是相同的,複製粘貼):http://stackoverflow.com/questions/11284981/javascript-slight-division-error –

+0

Downvoting沒有幫助,它沒有出現在類似的問題部分。每種語言都有很多例子,但每一個都被低估了。爲什麼? – Mustafa

+0

不是我的downvote。將鼠標懸停在downvote圖標上時,您會看到「此問題**沒有顯示任何研究成果**;它不清楚或沒有用處(再次單擊以撤消)」。這個問題已被多次詢問,並且通過在搜索引擎/ Google中輸入關鍵字很容易找到。 [在Stack Overflow的搜索引擎中複製粘貼你的標題](http://stackoverflow.com/search?tab=relevance&q=javascript%20adding%200.1%20to%200.2%20causes%200.30000000000000004),並出現幾個重複項。 [與Google相同](http://www.google.com/search?q=Javascript+adding+0.1+to+0.2+causes+0.30000000000000004) –

回答

1

這是預期的。 Floating point計算機上的操作有small accuracy errors,這是因爲它們存儲在計算機中的方式。欲瞭解更多信息,我建議您閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic

將無限多個實數擠壓成有限位數 需要近似表示法。雖然無限多個整數,但在大多數程序中,整數計算的結果可以以32位存儲。相比之下,給定任意固定位數,大多數使用實數的計算將產生不能使用那麼多位精確表示的數量。因此,浮點計算的結果必須經常按照 的順序進行四捨五入以適應其有限表示。該四捨五入錯誤是浮點計算的特徵 。

與此類似的問題得到了相當多的詢問。見this

+6

如果您知道這實質上是重複的,那麼您應該投票結束爲重複,而不是發佈答案... –

2

要輸出0.3,可以使用toFixed,而@Oleksi指出的浮點數有輕微的錯誤計算。

console.log((0.1 + 0.2).toFixed(1)); // 0.3 
相關問題