parseInt округляет неправильно - PullRequest
16 голосов
/ 15 февраля 2012

Я наткнулся на эту проблему с 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 ]

15 голосов
/ 15 февраля 2012

Не путайте 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).

12 голосов
/ 15 февраля 2012

С этот ответ

Все числа в Javascript имеют 64-битную «двойную» точность IEE754. с плавающей точкой.

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

2 ^ 53 = 9007199254740992

...