JavaScript - BigInt: Handling Really Big Numbers

안녕하세요, 야심 찬 코더 여러분! 오늘 우리는 자바스크립트에서 정말로, 정말로 큰 수를 다루는 흥미로운 여정을 시작할 것입니다. 안전벨트를 고정하고, BigInt의 fascinatings한 세계를 탐험해 보겠습니다!

JavaScript - BigInt

What is BigInt?

보자kal이 밤하늘의 별을数えて 보세요. 계속数えて 나가다가 갑자기 계산기가 "무한대"라고 말합니다. 실망스럽죠? 그래서 BigInt가 구원을 가져옵니다!

BigInt는 자바스크립트의 특별한 숫자 형식으로, 임의 길이의 정수를 표현할 수 있습니다. 일반 숫자와 달리, BigInt는 당신의 상상력(또는 컴퓨터의 메모리)만큼 큰 숫자를 다룰 수 있습니다.

Why do we need BigInt?

자바스크립트에서 일반 숫자는 64비트로 저장되며, 최대 안전한 정수 값은 9,007,199,254,740,991입니다. 이 숫자는 매우 큽니다만, 컴퓨팅의 세계에서는 때로 더 큰 숫자가 필요할 때가 있습니다!

이제 이 제한을 초과할 때 어떤 일이 일어나는지 보겠습니다:

console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992 (Oops! Same result)

보시다시피, 자바스크립트는 이 제한을 초과하는 숫자를 정확하게 표현할 수 없습니다. 여기서 BigInt가 빛을 발합니다!

Declaration and Initialization

BigInt를 만드는 것은 쉬워요. 두 가지 방법이 있습니다:

  1. 정수의 끝에 'n'을 추가합니다.
  2. BigInt() 함수를 사용합니다.

두 가지 방법을 모두 시도해 보겠습니다:

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

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

끝에 'n'이 보이시나요? 이로 인해 자바스크립트가 이것이 BigInt라고 알 수 있습니다!

Basic Operations

이제 우리의 큰 숫자를 가지고, 약간의 수학을 해보겠습니다!

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 (Integer division)
console.log(a % b);  // 1234567890n

记住, BigInt는 항상 정수입니다.除法의 경우, 결과는 가장 가까운 정수로 내림 Rounds down to the nearest integer.

Comparison

BigInt를 비교하는 것은 일반 숫자를 비교하는 것과 같습니다:

console.log(5n > 4n);   // true
console.log(5n < 4n);   // false
console.log(5n === 5);  // false (different types)
console.log(5n == 5);   // true (type coercion)

마지막 두 줄을 주목하세요. BigInt와 일반 숫자는 ==를 사용할 때 동일하게 간주되지만, ===를 사용할 때는 아닙니다. 이는 ===가 값과 형식 모두를 확인하기 때문입니다.

Conversions

때로는 BigInt와 일반 숫자 간의 변환을 해야 할 수 있습니다. 다음은 방법입니다:

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

console.log(regularNum);  // 123456789

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

큰 BigInt를 일반 숫자로 변환할 때는 정확성을 잃을 수 있으니 주의하십시오!

Examples

실제 예제로 BigInt 지식을 활용해 보겠습니다:

1. Factorials Calculation

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

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

이 함수는 일반 자바스크립트 숫자로는 불가능한 매우 큰 수의 계산을 할 수 있습니다!

2. Working with Really Large Prime Numbers

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) ? "Prime" : "Not Prime");  // Not Prime

이 함수는 일반 자바스크립트 숫자의 제한을 초과하는 숫자의 소수 여부를 확인할 수 있습니다!

Error Handling with BigInt

BigInt를 사용할 때 주의해야 할 몇 가지 사항이 있습니다:

try {
const result = 1n + 1;  // This will throw an error
} catch (error) {
console.log("Error:", error.message);  // Cannot mix BigInt and other types
}

try {
const result = Math.sqrt(4n);  // This will also throw an error
} catch (error) {
console.log("Error:", error.message);  // Cannot convert a BigInt value to a number
}

记住, BigInt는 수학 연산에서 다른 BigInt와만 사용할 수 있으며, 많은 Math 함수는 BigInt를 지원하지 않습니다.

BigInt Methods

가장 흔히 사용되는 BigInt 메서드 목록입니다:

Method Description Example
BigInt() Creates a BigInt value BigInt(123)
BigInt.asIntN() Wraps a BigInt value to a signed integer between -2^(n-1) and 2^(n-1)-1 BigInt.asIntN(3, 5n) // 5n
BigInt.asUintN() Wraps a BigInt value to an unsigned integer between 0 and 2^n-1 BigInt.asUintN(3, 5n) // 5n
BigInt.prototype.toString() Returns a string representation of a BigInt value (123n).toString() // "123"
BigInt.prototype.valueOf() Returns the primitive value of a BigInt object Object(123n).valueOf() // 123n

이제 여러분은 별보다도 큰 숫자를 다루는 능력을 갖추었습니다. 기억하세요, 큰 힘에는 큰 책임이 따릅니다 - BigInt를 지혜롭게 사용하세요!

Happy coding, and may your numbers always be as big as your dreams!

Credits: Image by storyset