Согласно спецификации JS / ECMAScript, тип Number
использует плавающую точку двойной точности, которая имеет 64-битный формат (binary64
), состоит из знакового бита (определяет положительное или отрицательное значение), 11 экспоненциальных бит и 52 дробных бита (каждая цифра представляет 4 бита, следовательно, 64-битный имеет 16 цифр):
Тип числа, представляющий 64-битный формат двойной точностиЗначения IEEE 754-2008 , как указано в Стандарте IEEE для двоичной арифметики с плавающей запятой.
Максимальное положительное число, которое может быть правильно представлено с использованием двойной точности, равно 9007199254740992
, что может бытьдостигается с помощью Math.pow(2, 53)
.Если диапазон номеров находится между Math.pow(2, 53)
и Math.pow(2, 54)
(или между Math.pow(2, -53)
и Math.pow(2, -54)
), только четные числа могут быть правильно представлены, потому что экспонентные биты будут влиять на младший (младший) бит на битах дроби.
Давайте рассмотрим большую часть числа:
var x = 12345678912345.6789
var x = new Number(12345678912345.6789)
Это число содержит более 52 дробных бит (всего 72 бита), следовательно, округление используется для сохранения дробных бит до 52.
Также с этим десятичным числом:
var x = new Number(.12345678912367890)
Это число содержит 68 дробных битов, поэтому последний ноль обрезается для сохранения 64-битной длины.
Обычно числовое представлениебольше 9007199254740992
или меньше 1.1102230246251565E-16
хранятся в виде буквенных строк вместо Number
.Если вам нужно вычислить очень большие числа, для выполнения арифметики произвольной точности доступны определенные внешние библиотеки.
Дополнительная информация:
ECMAScript: кодировка чисел
ECMAScript: Работа с большими целыми числами