예제 코드는 예제 코드 주소 이 링크에서 확인할 수 있습니다.
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
'JavaScript > JavaScript' 카테고리의 다른 글
일급 객체(First-class citizen)과 고차 함수(Higher-order function) (0) | 2023.04.12 |
---|---|
Named Function Expression(기명 함수 표현식) (0) | 2023.04.11 |
Primitive Type, Null과 undefined (0) | 2022.12.13 |
Event Bubbling과 화살표 함수 (0) | 2022.12.12 |
자바스크립트 문자열 객체 (0) | 2022.07.22 |