BigInt
BigInt
Технический фундамент больших целых
bigint нужен, когда важна точность больших целых значений:
- защищает от ошибок за пределами safe integer диапазона;
- не предназначен для дробных вычислений;
- требует явного согласования типов в арифметике;
- полезен для счетчиков, идентификаторов и финансовых доменов с большими числами.
Выбор между number и bigint должен опираться на требования к точности.
Когда обычного number уже недостаточно
Тип number в JavaScript безопасно хранит целые значения только в диапазоне до Number.MAX_SAFE_INTEGER. Для очень больших целых чисел появляется риск потери точности. bigint решает эту проблему.
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); // true
Ключевой момент: bigint нужен для больших целых чисел, где точность критична.
Проверь себя: почему для идентификаторов, криптографии или финансовых счетчиков потеря одного разряда недопустима?
Как создавать bigint
Два основных способа:
const a = 9007199254740993n; // суффикс n
const b = BigInt('9007199254740993');
Смотри, что важно: bigint не используется для дробных чисел.
// console.log(BigInt(10.5)); // RangeError: нельзя из дробного number
Операции с bigint
const x = 10n;
const y = 3n;
console.log(x + y); // 13n
console.log(x * y); // 30n
Операции работают, но только если оба операнда совместимы по типу.
Здесь часто путаются: смешивать number и bigint напрямую нельзя.
const value = 10n;
// console.log(value + 5); // TypeError
Нужно явное приведение:
console.log(value + BigInt(5));
Сравнения bigint и number
Сравнение возможно, но арифметика без приведения нет.
console.log(10n > 5); // true
console.log(10n === 10); // false (разные типы)
Проверь себя: почему === здесь false, даже если числа выглядят одинаково?
bigint и JSON
Здесь часто путаются: JSON.stringify не умеет сериализовать bigint.
// JSON.stringify({ id: 1n }); // TypeError
Анти-провал: если нужно отправить bigint в API, обычно конвертируют его в строку (id.toString()), а на другой стороне парсят обратно.
Мини-сценарий: большой счетчик событий
let eventsProcessed = 0n;
function addBatch(size) {
eventsProcessed += BigInt(size);
}
Для длинно живущих систем с огромным числом событий bigint позволяет избежать переполнения безопасного диапазона number.
Частые ошибки новичков
- Использовать
bigintтам, где достаточноnumber. - Смешивать типы в арифметике без явного приведения.
- Ожидать работу дробных значений с
bigint. - Забывать про различие в строгом сравнении (
===).
Анти-провал: выбирай bigint только когда есть реальная потребность в точности на больших целых.
Что будет, если изменить вход
Если входной размер батча приходит строкой, нужно корректно преобразовать его к BigInt. Некорректная строка вызовет ошибку преобразования, и это лучше обработать заранее, чем получить падение в середине обработки.
Проверь себя: как безопасно обработать случай, когда в BigInt(...) попадает нечисловая строка?
Краткий итог
bigintпредназначен для очень больших целых чисел.- Он защищает от потери точности за пределами safe integer диапазона
number. - Нельзя смешивать
bigintиnumberв арифметике без приведения. bigintне поддерживает дробные значения.- Используй
bigintосознанно: там, где точность больших целых действительно критична.