parseInt轮回错误

Mrc*_*ief 16 javascript rounding

我偶然发现了这个问题,parseInt我不确定为什么会这样.

console.log(parseInt("16980884512690999"));   // gives 16980884512691000
console.log(parseInt("169808845126909101"));?  // gives 169808845126909100
Run Code Online (Sandbox Code Playgroud)

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

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

我在俯瞰什么?

小提琴

Jim*_*iTh 15

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

双浮点(即Javascript)具有53位有效位精度,这意味着javascript中最高/最低"肯定准确"的整数是+/- 9007199254740992(2 ^ 53).高于/低于这个数字可能变得准确(最后只是添加0的数字,因为指数位可以用来表示).

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

更新

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


dev*_*vio 12

这个答案

Javascript中的所有数字都是64位"双精度"IEE754浮点数.

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

2 ^ 53 = 9007199254740992