Javascript Max Int

Я думал, что максимальное целочисленное значение для javascript было 2^53, но когда я делаю следующее:

 parseInt(Math.pow(2, 53)) + 10

Я правильно получаю 9007199254741002

 (= 9007199254740992 + 10)

Это почему? Я хочу использовать библиотеку bigint.js только в том случае, если число больше или равно максимально допустимому целому числу.

2 ответа

Решение

JavaScript использует числа двойной точности IEEE-754, которые имеют примерно 15 цифр десятичной точности, но имеют огромный диапазон. В этом формате целые числа -2^53 через 2^53 все могут быть надежно представлены (это точность значения и формата). Вне этих пределов некоторые целые числа могут быть представлены, но другие не могут. Например, за пределами этого диапазона есть пробелы в целых числах.

Например, числа с двойной точностью могут представлять 9,007,199,254,740,992 (2^53) а также 9,007,199,254,740,994 (2^53 + 2), но нет 9,007,199,254,740,993 (2^53 + 1):

Пример сеанса консоли:

> 9007199254740992
9007199254740992
> 9007199254740992 + 1
9007199254740992
> 9007199254740992 + 2
9007199254740994

Обратите внимание на второй из них. Это не опечатка.

9007199254740992 максимальное целочисленное значение в JavaScript, прежде чем вы начнете сталкиваться с проблемами потери точности. Учтите это следующее:

> Math.pow(2, 53) + 1
9007199254740992
> Math.pow(2, 53) + 2
9007199254740994
> Math.pow(2, 53) + 3
9007199254740996
> Math.pow(2, 53) + 4

Как видно, полученное значение не является точным во всех случаях. Это ограничение чисел с плавающей запятой, возникающее из-за того, что коэффициенту выделено только 53 бита. Как только вы превысите диапазон, который может быть представлен 53 битами и знаковым битом, представление с плавающей запятой будет все больше попадаться или пропадать при увеличении значения.

Другие вопросы по тегам