2012-10-30 35 views
2

有沒有人知道爲什麼以下會返回第三個項目的值+ 1,而不僅僅是返回項目的正確值?JavaScript數組返回不正確的值的項目?

的jsfiddle:http://jsfiddle.net/gz4gA/

var items = [10150778347353933, 95698693940, 10151139500303463, 337394396325739, 181838311261, 186661577450, 131239636262, 408877845803303, 130260147046659, 10151850964430652, 190553376302, 256062744215, 73099117435, 30571361895, 85358203371, 133621058800, 67899501771, 422515109312, 56271008850, 107997326726, 382312857465, 144163385597840, 10150882307310061, 184244804960462, 63953746442, 114588455254586, 201992215550, 401799715673, 287217811299764, 96668113887, 106824841365, 130084127023410, 186061480932, 60351005403, 209693813195, 10150593297330601, 319622191193, 68686268942, 290590784383, 63467856465, 470235003273, 127564720953, 127437064077, 102351319089, 113530295368, 82102942060, 290699835908, 81445359355, 137490940846, 119104781632, 415115129332, 120520318032430, 142666108227, 146711457500, 344723925588563, 239108779476988, 121853939741, 109322101963, 54456613147, 473850413696, 10150329755772674]; 
console.log(items[2]); 

+2

可能超過了javascript可以表示的最大整數? – jfriend00

+1

商品代碼可以更好地表示爲字符串。保存前導零點消失的問題。 – James

回答

4

JavaScript的數字是64位浮點值。可以完全表示的最大整數值是2 或9007199254740992.大於該值的數字(包括數組元素)僅表示大約。參見例如,ECMA 262-5, section 8.5

+0

感謝您的快速反應和解釋! – mkp

+0

這不是完全可以表示的最大整數值,請參見['Number.MAX_VALUE'](http://ecma-international.org/ecma-262/5.1/#sec-15.7.3.2)。 – RobG

+0

@RobG - 嗯,是的,一些較大的整數可以精確地表示。這措辭不好。我應該說的是,它是範圍整數中最大的一個,沒有空位可以表示。除此之外,你開始找到無法表示的整數。 (請注意,例如'Number.MAX_VALUE - 1'不能在JavaScript中表示。'console.log(Number.MAX_VALUE ==(Number.MAX_VALUE-1))'將打印爲'true'。) –

2

每這個答案https://stackoverflow.com/a/307200/816620,即JavaScript可以代表所有整數範圍內的頂部是:9007199254740992比你10151139500303463小。所以,你的電話號碼太大了。

如果這些都是項目代碼而不是您真的需要用作數字的東西,那麼也許您應該將它們存儲爲字符串,而不是數字。

+0

感謝快速反應! – mkp

+0

這是不正確的。可以準確表示的**連續**整數的序列是-2^53到+ 2^53。還有更多可以精確表示的東西,但它們並不連續。最大的整數由[Number.MAX_VALUE](http://ecma-international.org/ecma-262/5.1/#sec-15.7.3.2)給出,它大約爲1.7976931348623157×10^308',[[ Number.MIN_VALUE'](http://ecma-international.org/ecma-262/5.1/#sec-15.7.3.3),它大約是5×10^-324。 – RobG

+0

@RobG - 羅布,你在這裏是一種技術,並沒有真正解決OP問題的背景。此上下文中的最大整數表示OP的整數超出了javascript可精確表示任何整數的範圍。 – jfriend00