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 осознанно: там, где точность больших целых действительно критична.