Следующий кодJavaScript Целочисленное переполнение
console.log(Math.pow(2, 53));
console.log(Math.pow(2, 53) + 1);
производит точно такой же выход для обоих расчетов:
9007199254740992
Почему?
Следующий кодJavaScript Целочисленное переполнение
console.log(Math.pow(2, 53));
console.log(Math.pow(2, 53) + 1);
производит точно такой же выход для обоих расчетов:
9007199254740992
Почему?
Результат, который вы видите, возникает из-за того, что Math.Pow()
работает с числами с плавающей запятой, и когда вы достигаете 16-й десятичной цифры, вы не можете добавить одну к наименее значащей десятичной цифре значения и ожидать, что результат изменится.
Обычно в 64-битном (8-байтовом) IEEE 754 двоичном значении с плавающей запятой 53 бит для мантиссы (включая подразумеваемый 1-бит). Ваш расчет Math.Pow(2, 53)
требует, чтобы в мантиссе было 54 бита, чтобы гарантировать изменение. Если вы добавите 2, вы должны увидеть изменение.
Все номера Javascript являются двойными.
No. Все номера в JavaScript - это 64-битные числа с плавающей запятой. – simeg
Возможный дубликат: http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to –