Целочисленное переполнение JavaScript - PullRequest
5 голосов
/ 30 января 2011

Следующий код

console.log(Math.pow(2, 53)); 
console.log(Math.pow(2, 53) + 1);

выдает одинаковый вывод для обоих вычислений:

9007199254740992

Почему?

Ответы [ 2 ]

10 голосов
/ 30 января 2011

Результат, который вы видите, происходит потому, что Math.Pow() работает с числами с плавающей запятой, и когда вы достигнете 16-го десятичного знака, вы не сможете обязательно добавить один к наименее значимому десятичному числу значения и ожидать, что результат изменится.

Обычно в 64-битном (8-байтовом) IEEE 754 двоичном значении с плавающей запятой 53 мантиссы (включая подразумеваемый 1-битный).Ваш расчет Math.Pow(2, 53) требует 54 бит в мантиссе, чтобы гарантировать изменение.Если вы добавите 2, вы увидите изменение.

0 голосов
/ 30 января 2011

Все числа Javascript двойные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...