JavaScript - BigInt: Работа с очень большими числами

Здравствуйте,野心勃勃的程序员们!今天,我们将踏上一段令人兴奋的旅程,探索JavaScript中真正的大数世界。系好安全带,因为我们即将探索BigInt的迷人领域!

JavaScript - BigInt

Что такое BigInt?

Представьте, что вы считаете звезды на ночном небе. Вы считаете и считаете, но suddenly ваш калькулятор говорит "Бесконечность". Раздражающе, правда? Вот где приходит на помощь BigInt!

BigInt - это особый числовой тип в JavaScript, который может представлять целые числа произвольной длины. В отличие от обычных чисел, которые имеют ограничения, BigInt может обрабатывать числа настолько grandes, насколько позволяет ваше воображение (или память вашего компьютера).

Зачем нам нужен BigInt?

В JavaScript, обычные числа хранятся в 64 бит, что означает, что они имеют максимальное безопасное целое значение 9,007,199,254,740,991. Это большое число, но в мире компьютинга иногда нужно идти еще дальше!

Давайте посмотрим, что happens когда мы пытаемся превысить этот предел:

console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992 (Ой! Тот же результат)

Как видите, JavaScript не может точно представлять числа beyond этого предела. Вот где сияет BigInt!

Объявление и инициализация

Создание BigInt так же просто, как pie. У вас есть два варианта:

  1. Приложить 'n' в конце целого числа
  2. Используйте функцию BigInt()

Давайте попробуем оба:

const bigNumber1 = 1234567890123456789012345678901234567890n;
const bigNumber2 = BigInt("9007199254740991");

console.log(bigNumber1); // 1234567890123456789012345678901234567890n
console.log(bigNumber2); // 9007199254740991n

Обратите внимание на 'n' в конце? Это как JavaScript знает, что это BigInt!

Основные операции

Теперь у нас есть наши большие числа, давайте сделаем немного математики!

const a = 1234567890n;
const b = 9876543210n;

console.log(a + b);  // 11111111100n
console.log(a - b);  // -8641975320n
console.log(a * b);  // 12193263111263526900n
console.log(a / b);  // 0n (Целочисленное деление)
console.log(a % b);  // 1234567890n

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

Сравнение

Сравнение BigIntов такое же, как и сравнение обычных чисел:

console.log(5n > 4n);   // true
console.log(5n < 4n);   // false
console.log(5n === 5);  // false (разные типы)
console.log(5n == 5);   // true (приведение типов)

Обратите внимание на последние две строки. BigIntы и обычные числа считаются равными при использовании ==, но не при использовании ===. Это потому, что === проверяет как значение, так и тип равенства.

Преобразования

Иногда вам нужно преобразовывать между BigIntами и обычными числами. Вот как:

const bigNum = 123456789n;
const regularNum = Number(bigNum);

console.log(regularNum);  // 123456789

const backToBigInt = BigInt(regularNum);
console.log(backToBigInt);  // 123456789n

Будьте осторожны при преобразовании больших BigIntов в обычные числа, так как вы можете потерять точность!

Примеры

Давайте применим наши знания BigInt к реальным примерам:

1. Вычисление факториалов

function factorial(n) {
if (n === 0n) return 1n;
return n * factorial(n - 1n);
}

console.log(factorial(20n));  // 2432902008176640000n

Эта функция может вычислять факториалы гораздо больших чисел, чем возможно с обычными числами JavaScript!

2. Работа с очень большими простыми числами

function isPrime(n) {
if (n <= 1n) return false;
for (let i = 2n; i * i <= n; i++) {
if (n % i === 0n) return false;
}
return true;
}

const largeNumber = 2n ** 100n - 1n;
console.log(isPrime(largeNumber) ? "Простое" : "Не простое");  // Не простое

Эта функция может проверять простоту чисел far beyond пределов обычных чисел JavaScript!

Обработка ошибок с BigInt

При работе с BigIntами есть несколько веще, на которые стоит обратить внимание:

try {
const result = 1n + 1;  // Это вызовет ошибку
} catch (error) {
console.log("Ошибка:", error.message);  // Невозможно смешивать BigInt и другие типы
}

try {
const result = Math.sqrt(4n);  // Это также вызовет ошибку
} catch (error) {
console.log("Ошибка:", error.message);  // Невозможно преобразовать значение BigInt в число
}

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

Методы BigInt

Вот таблица самых commonly используемых методов BigInt:

Метод Описание Пример
BigInt() Создает значение BigInt BigInt(123)
BigInt.asIntN() оборачивает значение BigInt в знакоположительное целое число между -2^(n-1) и 2^(n-1)-1 BigInt.asIntN(3, 5n) // 5n
BigInt.asUintN() оборачивает значение BigInt в беззнакоположительное целое число между 0 и 2^n-1 BigInt.asUintN(3, 5n) // 5n
BigInt.prototype.toString() Возвращает строковое представление значения BigInt (123n).toString() // "123"
BigInt.prototype.valueOf() Возвращает примитивное значение объекта BigInt Object(123n).valueOf() // 123n

И вот оно,folks! Теперь вы equiped для работы с числами больше, чем звезды на небе. Помните, с великой силой приходит великая ответственность - используйте свои BigIntы мудро!

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

Credits: Image by storyset