2012-07-05 51 views
2

我使用parseInt()來獲得一些大的素數,但它的工作方式與預期的一樣。例如,如何在JavaScript中使用parseInt()

parseInt("18014398241046527", 10); // Gives me 18014398241046528?? 
parseInt("18014398241046528", 10); // Gives me 18014398241046528 
parseInt("18014398241046529", 10); // Still gives me 18014398241046528?? 

我在Chrome版本20.0.1132.47和Firefox 12.0上測試了它們。這是因爲我試圖解析的數字太大了嗎?

+1

不太大:太多有效數字。 – nnnnnn

+0

P.S. parseInt()不是問題,只是JS數字的工作方式。有幾個JS庫可以處理更重要的數字,例如[BigNumber](http://jsfromhell.com/classes/bignumber)。 – nnnnnn

+0

看起來這裏有一個溢出的模式。它全部從2個字節開始,01,10,11將是10,00將是00

0 '->' 11111111111111110 1 '->' 11111111111111112 2 '->' 11111111111111112 3 '->' 11111111111111112 4 '->' 11111111111111114 5 '->' 11111111111111116 6 '->' 11111111111111116 7 '->' 11111111111111116 8 '->' 11111111111111118
dolaameng

回答

0

這不是parseInt;對於JavaScript的Number數據類型,此數字太長(太精確 - 請參閱nhahtdh的答案)(證明:+"18014398241046527"的收益率也爲18014398241046528)。

我認爲解決這個問題的唯一方法就是將數字輸入爲一個字符串並以塊的形式處理它。

+0

「...證明...」?你不可能是神聖的。用底層的V8和SpiderMonkey代碼向我證明它,但不是這樣 – Alexander

+0

@Alexander - 其他字符串到數字轉換方法具有相同問題的事實證明「問題」不僅僅與parseInt() 。儘管nhahtdh的回答更精確(哈!看看我在那裏做了什麼?),但實際上發生了什麼。底層的JS引擎代碼在這裏不相關。 – nnnnnn

+3

@nnnnnn,我會換句話說:至少引用標準。這個「證明」仍然沒有收斂任何有用的東西。 JS引擎的實現最終可能是錯誤的,但是有了這些信息,你就不知道了。 – Alexander

5

JavaScript中的數字是浮點雙精度,它只能包含高達53位的精度(大約16位十進制數字)。您在問題中的數字是17位數字,因此無法準確存儲數字。

關於JavaScript syntax/Number的維基百科文章。

參考JavaScript (1.1) standard