자바스크립트에서는 여러 자료형의 종류가 있습니다. 오늘은 그 중 Number라는 자료형에 대해 알아봅시다.
자바스크립트의 Number 데이터 타입은 64비트(8바이트)의 고정된 크기의 공간을 확보합니다. 이 때문에 정확하게 표현할 수 있는 숫자의 범위가 제한됩니다. 이 64비트 공간으로는 매우 큰 숫자를 정확하게 표현할 수 없습니다.
const maxNum = Number.MAX_SAFE_INTEGER
console.log(maxNum) //9007199254740991
console.log(maxNum+2)
//9007199254740992
//믿기지 않는다면 실제 콘솔에 찍어보세요!
Number.MAX_SAFE_INTEGER은 자바스크립트에서 안전하게 표현할 수 있는 가장 큰 정수입니다. 이 값은 2의 53승 - 1, 즉 9007199254740991로 정의되어 있습니다.
이보다 더 큰 값은 일반적으로 부동소수점 형태인 Number로 정확하게 표현할 수 없습니다. 이는 부동소수점 형태의 Number가 고정된 비트 수로 표현되기 때문에 발생하는 한계입니다.
쉽게 말해 9007199254740991 라는 숫자가 Number 자료형으로 정확하게 표현할 수 있는 가장 큰 숫자라는 것입니다. 이 이상의 큰 값은 Number로 표현할 때 정확성을 잃게 됩니다.
그렇다면 우리는 평생 9007199254740991 보다 큰 숫자는 정확하게 표현 할 수 없을까요? 그렇지 않습니다!
BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
const maxNum = BigInt(Number.MAX_SAFE_INTEGER)
const bigIngTwo = BigInt(2)
console.log(maxNum + bigIngTwo)
//9007199254740993n
짜자잔 BigInt 를 적용하니 정확한 계산 값이 나왔습니다.
어어... 맨 뒤에 있는 저 n 이 거슬린다구요..?
BigInt로 반환한 값을 다시 Number로 변환하면 안되냐구요..?
Number로 변환할 경우 정밀도 손실이 발생할 수 있으므로 주의해야 합니다.
정밀도 손실을 방지하기 위해서는 BigInt를 사용한 상태에서 BigInt 연산을 유지해야 합니다. BigInt는 정수를 정확하게 표현하기 위해 임의의 정밀도를 사용하므로 정수 연산에 대한 정확성과 정밀도가 보장됩니다.
예를 들어, BigInt로 표현된 숫자를 사용하여 계산을 수행하고, 결과를 BigInt로 유지하는 방법은 다음과 같습니다:
const result = maxNum + bigIngTwo
console.log(result.toString())
//9007199254740993
결과값을 result 변수에 담아준 뒤 string으로 전환을 하면 이렇게 깔끔하게 원하는 답이 나올 수 있게 됩니다. 참고로 string 자료형 또한 Number와 달리 공간 확보에 대한 정해진 규격이 없습니다.
BigInt는 Number와는 다른 방식으로 숫자를 표현하고 처리합니다. Number는 부동소수점 형태로 숫자를 표현하는 반면, BigInt는 정수만 다루며 소수를 포함하지 않습니다.
BigInt는 임의의 정밀도를 가지며 필요한 만큼의 메모리를 동적으로 할당하여 정수를 표현합니다. 이는 Number의 제한된 비트 수에 얽매이지 않고 큰 숫자를 정확하게 표현할 수 있도록 해줍니다.
궁금하다면 직접 찍어보면 됩니다.
const bigIntNum = BigInt('12345678901234567890');
console.log(typeof bigIntNum); // 출력: "bigint"
const bigIntSum = bigIntNum + BigInt(5);
console.log(bigIntSum); // 출력: 12345678901234567895n
그렇습니다. bigint의 자료형은 "bigint" 입니다.
그것이 "bigint" 니까요...

BigInt와 Number는 어떤 면에서 비슷하지만 중요한 차이점이 있습니다.
예컨대 BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없고 연산에서 Number와 혼합해 사용할 수 없습니다.
따라서 먼저 같은 자료형으로 변환해야 합니다. 그러나, BigInt가 Number로 바뀌면 정확성을 잃을 수 있으니 주의해야 합니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
와! 너무 유익해요! 잘 봤습니다