ParseInt неверно - программирование
Подтвердить что ты не робот

ParseInt неверно

Я наткнулся на эту проблему с помощью parseInt, и я не уверен, почему это происходит.

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

Я явно не нажимаю никаких ограничений по количеству в ограничениях JavaScript (Number.MAX_VALUE = 1.7976931348623157e+308)

Запуск Win 7 64 бит, если это имеет значение.

Что я пропускаю?

Fiddle

4b9b3361

Ответ 1

Не путайте Number.MAX_VALUE с максимальным точным значением. Все числа в javascript хранятся в виде 64-битной с плавающей запятой, что означает, что вы можете получить высокие (и низкие) числа, но они будут точными до определенной точки.

Двойные плавающие точки (т.е. Javascript) имеют 53 бит значимой точности, что означает, что наивысшее/низкое "точно точное" целое число в javascript равно +/- 9007199254740992 (2 ^ 53). Числа выше/ниже, которые могут оказаться точными (те, которые просто добавляют 0 на конец, потому что биты экспоненты могут использоваться для представления этого).

Или, по словам ECMAScript: "Обратите внимание, что все положительные и отрицательные целые числа, величина которых не превышает 2 ^ 53, представимы в типе Number (действительно, целое число 0 имеет два представления, +0 и -0 )".

Обновление

Чтобы добавить немного к существующему вопросу, спецификация ECMAScript требует, чтобы, если целое число имеет менее 22 цифр, .toString() выведет его в стандартную десятичную нотацию (например, 169808845126909100000, как в вашем примере). Если он имеет 22 или более цифр, он будет выводиться в нормированной научной нотации (например, 1698088451269091000000 - дополнительный 0 - выводится как 1.698088451269091e+21).

Ответ 2

От этот ответ

Все номера в Javascript - 64-битная "двойная" точность IEE754 с плавающей запятой.

Самое большое положительное целое число, которое может быть точно представляет собой 2 ^ 53. Остальные биты зарезервированы для экспоненты.

2 ^ 53 = 9007199254740992