2011-01-30 2 views
5

Следующий кодJavaScript Целочисленное переполнение

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

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

9007199254740992 

Почему?

+0

Возможный дубликат: http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to –

ответ

10

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

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

-3

Все номера Javascript являются двойными.

+0

No. Все номера в JavaScript - это 64-битные числа с плавающей запятой. – simeg

Смежные вопросы