BigInt

예제 코드는 예제 코드 주소 이 링크에서 확인할 수 있습니다.

BigInt는 ECMAScript 2020에 도입된 데이터 유형으로, 아주 큰 정수(Integer)를 표현하기 위해 등장한 데이터 타입입니다.

자바스크립트의 숫자에는 안전한 정수 표현의 한계가 있었습니다. 자바스크립트에서 안전한 최대 정수는 2**53 - 1인 'Number.MAX_SAFE_INTEGER'까지의 정수만 나타낼 수 있습니다. 안전한 정수 표현이라는 의미는 이 숫자 범위를 초과하는 정수를 나타내려고 하면 부정확한 계산이 되어 반올림 오류가 발생하기 때문입니다.

예를 들면, 9007199254740991 + 1과 9007199254740991 + 2를 비교하면 true라는 결과가 리턴됩니다. 실제로 콘솔에 9007199254740991 + 2과 심지어 9007199254740993을 출력해 봐도 9007199254740993이 아니라 9007199254740992가 출력되는 모습을 확인할 수 있는데요.

console.log(9007199254740991 + 1 === 9007199254740991 + 2); // true
console.log(9007199254740991 + 2);                          // 9007199254740992
console.log(9007199254740993);                              // 9007199254740992

이 숫자 범위는 JavaScript가 IEEE 754에 기술된 배정밀도 부동소수점 형식 숫자체계를 사용하기 때문입니다. 간단하게 말하면 '자바스크립트의 숫자형(number type) 값에는 9000조 정도의 정수 표현의 한계가 존재한다.' 입니다.

만약 number type의 범위를 넘어가는 계산을 할 때 BigInt라는 데이터 타입의 값을 사용하면 됩니다. BigInt 타입의 값은 일반 정수 마지막에 알파벳 n을 붙이거나 BinInt라는 함수를 사용하면 되는데요.

console.log(9007199254740993n); // 9007199254740993n
console.log(BigInt(9007199254740993)); // 9007199254740993

'BigInt' 타입도 'Number'타입과 마찬가지로 수학 연산에서 사용할 수 있습니다.

const bi1 = 12345678901234567890n;
const bi2 = 98765432109876543210n;

const sum = bi1 + bi2;
const difference = bi1 - bi2;
const product = bi1 * bi2;
const quotient = bi1 / bi2;

console.log(sum)        // 111111111011111111100n
console.log(difference) // -86419753208641975320n
console.log(product)    // 1219326311370217952237463801111263526900n
console.log(quotient)   // 0n

이러면 결괏값은 모두 'BigInt'를 반환합니다.

또한 'BigInt'는 비교 연산자를 사용하여 서로를 비교할 수 있습니다.

const bi3 = 12345678901234567890n;
const bi4 = 98765432109876543210n;

console.log(bi3 < bi4);   // true
console.log(bi3 === bi4); // false

이렇게 BigInt 타입을 사용하면 2**53 - 1 보다 큰 정숫값도 안전하게 표현할 수가 있습니다. 단, BigInt 타입에는 몇 가지 주의사항이 있는데요. 일단 BigInt 타입은 말 그대로 큰 정수를 표현하기 위한 데이터 타입이기 때문에 소수 표현에는 사용할 수가 없습니다.

1.5n; // SyntaxError

그래서 소수 형태의 결과가 리턴되는 연산은 소수점 아랫부분은 버려지고 정수 형태로 리턴됩니다.

console.log(10n / 6n);  // 1n
console.log(5n / 2n);   // 2n

그리고 BigInt 타입끼리만 연산할 수 있고, 서로 다른 타입끼리의 연산은 명시적으로 타입 변환을 해야 합니다.

// console.log(3n * 2);       // TypeError
console.log(Number(3n) * 2);  // 6