2012-02-15 71 views
16

我偶然發現了parseInt這個問題,我不知道爲什麼會發生這種情況。parseInt輪不正確

console.log(parseInt("16980884512690999")); // gives 16980884512691000 
console.log(parseInt("169808845126909101"));​ // gives 169808845126909100 

我顯然不是打在JavaScript限制 (Number.MAX_VALUE = 1.7976931348623157e+308

任何數量限制運行Windows 7 64位,如果該事項。

我在忽略什麼?

Fiddle

回答

15

不要用最大準確值混淆Number.MAX_VALUE。 javascript中的所有數字都存儲爲64位浮點數,這意味着您可以獲取高(和低)數字,但它們只會精確到某個點。

雙浮點(即Javascript's)具有53位有效精度,這意味着javascript中的最高/最低「肯定準確」整數爲+/- 9007199254740992(2^53)。高於/低於的數字可能會導致準確(最後只加0,因爲指數位可以用來表示這個數)。用ECMAScript的話來說:「請注意,所有大小不超過2^53的正整數和負整數都可以用Number類型表示(的確,整數0有兩個表示,+0和 - 0)。」

更新

我想補充一點,以現有的問題,ECMAScript的規範要求,如果一個整數少於22位,.toString()將輸出它的標準十進制形式(如169808845126909100000在你例)。如果它有22位或更多位數,它將以標準科學記數法輸出(例如,1698088451269091000000 - 另外的0 - 輸出爲1.698088451269091e+21)。

+0

這兩個答案都是正確的,但是這個解釋它的長度,也解釋了我看似不正常的輸出意味着什麼。 – Mrchief 2012-02-16 03:26:43

12

this answer

所有數字在Javascript中有64位 「雙」 精度IEE754 浮點。

因此可以準確地代表的最大正整數是2^53。其餘的位保留給指數。

2^53 = 9007199254740992

+1

是;另請參閱http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html「每位計算機科學家應瞭解浮點運算的知識」 – 2012-02-15 16:57:21

+0

那麼,爲什麼我會得到'169808845126909100'而不是一些溢出錯誤或其他東西?這大於'9007199254740992' – Mrchief 2012-02-15 16:58:35

+1

請參閱我的回答。因爲'1698088451269091'低於這個數字,並且末尾的0是指數的一部分(即它可以寫成1698088451269091 x 10^2)。它不會溢出,因爲這是浮點運算的方式。它並不在乎你在尋找整數。 – JimmiTh 2012-02-15 17:00:33