parseInt轮回错误

时间:2012-02-15 16:43:26

标签: javascript rounding

我在parseInt偶然发现了这个问题,我不确定为什么会发生这种情况。

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

我显然没有达到JavaScript限制中的任何数量限制 (Number.MAX_VALUE = 1.7976931348623157e+308

如果重要的话,运行Win 7 64位。

我在俯瞰什么?

Fiddle

2 个答案:

答案 0 :(得分:15)

请勿将Number.MAX_VALUE与最大准确值混淆。 javascript中的所有数字都存储为64位浮点数,这意味着您可以获得高(和低)数字,但它们只能精确到某一点。

双浮点(即Javascript)具有53位有效位精度,这意味着javascript中最高/最低“肯定准确”整数为+/- 9007199254740992(2 ^ 53)。高于/低于该值的数字可能结果是准确的(那些只是简单地在末尾加0,因为指数位可以用来表示)。

或者,用ECMAScript的话来说:“注意,数量类型不大于2 ^ 53的所有正整数和负整数都可以在数字类型中表示(实际上,整数0有两个表示,+ 0和-0 )“。

<强>更新

只是为现有问题添加一点,ECMAScript规范要求如果整数数字少于22位,.toString()将以标准十进制表示法输出(例如169808845126909100000,如同例)。如果它有22位或更多位数,它将以标准化的科学记数法输出(例如1698088451269091000000 - 另外的0 - 输出为1.698088451269091e+21)。

答案 1 :(得分:12)

来自this answer

  

Javascript中的所有数字都是64位“双精度”IEE754   浮点。

     

因此可以准确的最大正整数   代表是2 ^ 53。其余位保留给指数。

2 ^ 53 = 9007199254740992

相关问题