BigInt: примеры (JAVASCRIPT)
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.
Расширенные примеры применения
Работа с битовыми операциями:
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
Вычисления в криптографии:
const prime = 2n ** 256n - 2n ** 32n - 977n;
console.log(prime.toString(16));fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
Рекурсивные вычисления (факториал):
function factorial(n) {
if (n <= 1n) return 1n;
return n * factorial(n - 1n);
}
console.log(factorial(30n));265252859812191058636308480000000n
Операции с датами и временем в наносекундах:
const nanoseconds = BigInt(Date.now()) * 1000000n;
console.log(nanoseconds);1712345678901234567n
Взаимодействие с TypedArray:
const bigIntArray = new BigInt64Array([9007199254740991n, -9007199254740991n]);
console.log(bigIntArray.reduce((a, b) => a + b));0n