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. У вас есть два варианта:
- Приложить 'n' в конце целого числа
- Используйте функцию 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