2011-11-02 23 views
0

爲什麼會發生這種情況:的Javascript加入小數到多個

window.onload = function(){ 
    var bob=new Number(1); 
    for (var i=0; i<8 ;i++){   
     bob=Number(bob+1.1)    
    } 

} 

通知: 2.1

3.2

4.300000000000001

5.4

6.5

7.6

8.7

9.799999999999999

+0

有關此問題的解決方法和討論,請參閱http://stackoverflow.com/questions/1458633/egant-workaround-for-javascript-floating-point-number-problem。 – jfriend00

+0

可能重複[JavaScript的數學是否被破壞?](http://stackoverflow.com/questions/588004/is-javascripts-math-broken) –

回答

0

這是四捨五入的問題。 4.3在二進制文件中沒有確切的表示。

數字在JavaScript中的確切存儲方式實際上是特定於實現的,但始終是二進制浮點。

編輯:

看起來像我的信息是有點過時。現在的標準規定雙精度64位格式的IEEE 754個值

鏈接:

+1

有固定的格式將能夠準確地存儲4.3。問題是JavaScript使用浮動。 – david

0

因爲在JavaScript中, 「數字」 默認爲浮點。甚至「我」;-)當然,「鮑勃」。

而且浮點數是近似值

如果你願意,你可以使用 「地板()」 和 「小區()」

PS: 您還可以使用parseInt函數()爲float轉換爲int:

parseInt (4.33) // Result = 4 

或圓形():

round (3.2 + 1.1) // 4.3, not 4.300000000000001 
0

因爲JavaScript的數量實際上是一個雙精度浮點數:

從規格:

4.3.19 
Number value 
    primitive value corresponding to a double-precision 
    64-bit binary format IEEE 754 value 
+0

確實是一個double。 – gsnedders

0

問題與電腦怎麼辦,它在基礎(2)上工作,計算基礎(10)算術。有很多文章解釋細微差別。

如果您還沒有解決您的問題,那麼無論何時您使用浮點數,您還應該使用適當的函數按摩輸出。

我通常使用number.toFixed(),它將四捨五入到合適的小數位數。

+0

問題是JavaScript的設計者決定使用這種方式的格式,並且不提供默認情況下正確處理基本10的數字類型。 – nnnnnn