2012-02-15 49 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