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 битами и знаковым битом, представление с плавающей запятой будет все больше попадаться или пропадать при увеличении значения.