BigInt: примеры (JAVASCRIPT)

Работа с большими числами в JavaScript через BigInt
Раздел: Основные типы, Числа
BigInt(value: number | string | boolean): bigint

Функция BigInt в JavaScript

Функция BigInt позволяет создавать числовые значения произвольной длины, которые выходят за пределы безопасного диапазона целых чисел Number. Она используется для работы с большими целыми числами в криптографии, финансовых расчетах, обработке идентификаторов или любых операциях, требующих высокой точности.

Функция может быть вызвана как конструктор new BigInt() или как обычная функция BigInt(). Разница заключается в том, что конструктор создает объект-обертку, а обычный вызов возвращает примитивное значение типа bigint.

Аргументы

Функция принимает один аргумент, который может быть:

  • Целое число: числовой литерал (например, 123)
  • Строка: строковое представление целого числа (например, "9007199254740991")
  • Булево значение: true преобразуется в 1n, false — в 0n
  • BigInt значение: возвращает новое значение BigInt
  • Другие типы: для чисел с плавающей точкой, null, undefined, символов или объектов выбрасывается исключение

Возвращаемое значение

Функция возвращает значение типа bigint, которое представляет целое число произвольной точности. Если преобразование невозможно, возникает ошибка RangeError или TypeError.

Базовые примеры использования

Простое создание BigInt из числа:

BigInt(123);
123n

Создание из строки:

BigInt("9007199254740993");
9007199254740993n

Использование с булевыми значениями:

BigInt(true);
BigInt(false);
1n
0n

Шестнадцатеричная и двоичная запись:

BigInt("0xFF");
BigInt("0b1010");
255n
10n

Арифметические операции:

const a = BigInt(10);
const b = 20n;
console.log(a + b);
console.log(b - a);
console.log(a * b);
console.log(b / a);
30n
10n
200n
2n

Альтернативные возможности JavaScript

Для работы с числами в JavaScript доступны следующие альтернативы:

  • Number: стандартный числовой тип с ограниченным диапазоном (±(2^53-1)). Используется для большинства математических операций и быстрее BigInt.
  • Math объект: предоставляет методы для работы с числами стандартной точности (округление, тригонометрия и др.).
  • BigInt64Array и BigUint64Array: типизированные массивы для хранения 64-битных целых чисел, полезны для работы с бинарными данными.

BigInt предпочтительнее использовать при работе с целыми числами, превышающими 2^53-1, или когда требуется точность в целочисленных операциях. Number лучше подходит для операций с плавающей точкой и когда производительность критична.

Аналоги в других языках

Python

В Python целые числа по умолчанию имеют произвольную точность:

x = 9007199254740993
print(x)
9007199254740993

PHP

PHP использует строки или специальные классы для больших чисел:

$x = gmp_init("9007199254740993");
echo gmp_strval($x);
9007199254740993

C

В C требуются сторонние библиотеки (GMP, OpenSSL):

#include <gmp.h>
mpz_t num;
mpz_init_set_str(num, "9007199254740993", 10);

MySQL

Используется тип DECIMAL с указанием точности:

SELECT CAST('9007199254740993' AS DECIMAL(30,0));

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

Распространенные ошибки

Смешивание BigInt и Number в арифметических операциях:

10n + 5;
TypeError: Cannot mix BigInt and other types, use explicit conversions

Использование чисел с плавающей точкой:

BigInt(3.14);
RangeError: The number 3.14 cannot be converted to a BigInt because it is not an integer

Применение операторов, не поддерживающих BigInt:

Math.sqrt(16n);
TypeError: Cannot convert a BigInt value to a number

Потеря точности при преобразовании:

Number(9007199254740993n);
9007199254740992

Некорректные строковые значения:

BigInt("123.45");
SyntaxError: Cannot convert 123.45 to a BigInt

Изменения в последних версиях

  • ECMAScript 2020: добавлена поддержка BigInt в JSON.stringify через метод toJSON.
  • ECMAScript 2021: улучшена производительность операций с BigInt в движках V8 и SpiderMonkey.
  • ECMAScript 2023: добавлена поддержка BigInt в методах Array.prototype.sort и TypedArray.
  • Node.js 16+: включена полная поддержка BigInt во всех встроенных модулях, включая buffer и fs.

Расширенные примеры применения

Работа с битовыми операциями:

Пример javascript
const a = 0b1111000011110000n;
const b = 0b0000111100001111n;
console.log((a & b).toString(2));
console.log((a | b).toString(2));
console.log((a ^ b).toString(2));
0
1111111111111111
1111111111111111

Вычисления в криптографии:

Пример javascript
const prime = 2n ** 256n - 2n ** 32n - 977n;
console.log(prime.toString(16));
fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f

Рекурсивные вычисления (факториал):

Пример javascript
function factorial(n) {
if (n <= 1n) return 1n;
return n * factorial(n - 1n);
}
console.log(factorial(30n));
265252859812191058636308480000000n

Операции с датами и временем в наносекундах:

Пример javascript
const nanoseconds = BigInt(Date.now()) * 1000000n;
console.log(nanoseconds);
1712345678901234567n

Взаимодействие с TypedArray:

Пример javascript
const bigIntArray = new BigInt64Array([9007199254740991n, -9007199254740991n]);
console.log(bigIntArray.reduce((a, b) => a + b));
0n

JS BigInt function comments

En
BigInt Creates a BigInt value