BigInt в JavaScript

Переменные BigInt в JavaScript используются для хранения больших целых чисел, которые невозможно представить обычными числами JavaScript.

Точность целых чисел в JavaScript

JavaScript может точно представлять целые числа только до 15 знаков:

Точность целых чисел

let x = 999999999999999;
let y = 9999999999999999;

Попробуйте сами

В JavaScript все числа хранятся в формате 64-битного плавающей точки (стандарт IEEE 754).

Согласно этому стандарту, большие целые числа не могут быть точно представлены и будут округлены.

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

  • максимум 9007199254740991(253-1)
  • минимум -9007199254740991-(253-1))

Числа за пределами этого диапазона теряют точность.

Как создать BigInt

Чтобы создать BigInt, можно добавить в конец числа nили вызов BigInt() Функция:

Пример 1

let x = 9999999999999999;
let y = 9999999999999999n;

Попробуйте сами

Пример 2

let x = 1234567890123456789012345n;
let y = BigInt(1234567890123456789012345);

Попробуйте сами

BigInt: новый тип данных JavaScript

Тип JavaScript для BigInt является "bigint

Пример

let x = BigInt(999999999999999);
let type = typeof x;

Попробуйте сами

BigInt является вторым числовым типом данных в JavaScript (после Number).

Для BigInt, JavaScript поддерживает всего 8 типов данных:

  1. Строка
  2. Number
  3. Bigint
  4. Boolean
  5. Неопределено
  6. Null
  7. Символ
  8. Объект

Операторы BigInt

Операторы, доступные для JavaScript Number, также доступны для BigInt.

Пример умножения BigInt

let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

Попробуйте сами

Внимание

Запрещается выполнять арифметические операции (преобразование типов) между BigInt и Number (информация может быть потеряна при преобразовании типов).

BigInt не может выполнять беззнаковое правое смещение (>>>), так как у него нет фиксированной ширины.

Дробные части BigInt

BigInt не может иметь дробные части.

Пример деления BigInt

let x = 5n;
let y = x / 2;
// Ошибка: Необходимо явно указать преобразование типов, так как BigInt и другие типы не могут быть смешаны, преобразование типов потеряет информацию.
let x = 5n;
let y = Number(x) / 2;

Попробуйте сами

BigInt в шестнадцатеричном, восьмеричном и двоичном формате

BigInt также можно записать в шестнадцатеричном, восьмеричном или двоичном формате:

Пример BigInt в шестнадцатеричном формате

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

Попробуйте сами

Curiosity о точности

Округление может угрожать безопасности программы:

Пример MAX_SAFE_INTEGER

9007199254740992 === 9007199254740993; // Возвращает true !!!

Попробуйте сами

Поддержка браузерами

С сентября 2020 года все браузеры поддерживают BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
Май 2018 года Январь 2020 года Июль 2019 года Сентябрь 2020 года Июнь 2018 года

Минимальные и максимальные безопасные целые числа

ES6 добавил свойства max и min к объекту Number:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER

Пример MAX_SAFE_INTEGER

let x = Number.MAX_SAFE_INTEGER;

Попробуйте сами

Пример MIN_SAFE_INTEGER

let x = Number.MIN_SAFE_INTEGER;

Попробуйте сами

Новые числовые методы

ES6 добавил два новых метода для объекта Number:

  • Number.isInteger()
  • Number.isSafeInteger()

Метод Number.isInteger()

Если параметр является целым числом, то метод Number.isInteger() возвращает true.

Пример isInteger()

Number.isInteger(10);
Number.isInteger(10.5);

Попробуйте сами

Метод Number.isSafeInteger()

Безопасные целые числа можно точно представить как двойную точность.

Если параметр является безопасным целым числом, то метод Number.isSafeInteger() возвращает true.

Пример isSafeInteger()

Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);

Попробуйте сами

Безопасные целые числа начинаются с -(253 - 1) до + (253 - 1) все целые числа.

Это безопасное целое: 9007199254740991. Это не безопасное целое: 9007199254740992.