爲什麼會發生這種情況:的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
爲什麼會發生這種情況:的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
這是四捨五入的問題。 4.3
在二進制文件中沒有確切的表示。
數字在JavaScript中的確切存儲方式實際上是特定於實現的,但始終是二進制浮點。
編輯:
看起來像我的信息是有點過時。現在的標準規定雙精度64位格式的IEEE 754個值
鏈接:
有固定的格式將能夠準確地存儲4.3。問題是JavaScript使用浮動。 – david
因爲在JavaScript中, 「數字」 默認爲浮點。甚至「我」;-)當然,「鮑勃」。
而且浮點數是近似值。
如果你願意,你可以使用 「地板()」 和 「小區()」
PS: 您還可以使用parseInt函數()爲float轉換爲int:
parseInt (4.33) // Result = 4
或圓形():
round (3.2 + 1.1) // 4.3, not 4.300000000000001
因爲JavaScript的數量實際上是一個雙精度浮點數:
從規格:
4.3.19
Number value
primitive value corresponding to a double-precision
64-bit binary format IEEE 754 value
確實是一個double。 – gsnedders
問題與電腦怎麼辦,它在基礎(2)上工作,計算基礎(10)算術。有很多文章解釋細微差別。
如果您還沒有解決您的問題,那麼無論何時您使用浮點數,您還應該使用適當的函數按摩輸出。
我通常使用number.toFixed()
,它將四捨五入到合適的小數位數。
問題是JavaScript的設計者決定使用這種方式的格式,並且不提供默認情況下正確處理基本10的數字類型。 – nnnnnn
有關此問題的解決方法和討論,請參閱http://stackoverflow.com/questions/1458633/egant-workaround-for-javascript-floating-point-number-problem。 – jfriend00
可能重複[JavaScript的數學是否被破壞?](http://stackoverflow.com/questions/588004/is-javascripts-math-broken) –