자바스크립트의 Number
자료형은 -+1부터 -1까지의 수를 표현할 수 있다. 범위를 벗어나는 수는 가까운 수나 0으로 반올림해서 반환한다.
let a = Number.MAX_SAFE_INTEGER // 9007199254740991
let b = a + 1 // 9007199254740992
let c = b + 1 // 9007199254740992
let d = 123456789876543456789 // 123456789876543460000
이러한 Number
자료형이 갖고 있는 범위의 제약을 벗어난 수를 다룰 수 있게 해주는 것이 바로 BigInt
자료형이다.
BigInt
자료형은 정수 리터럴 끝에 n
을 붙이거나 BigInt()
를 호출하여 BigInt
타입의 값을 생성할 수 있다.
let a = 123456789876543456789n // 123456789876543456789n
let b = BigInt(123456789876543456789) // 123456789876543456789n
let c = BigInt('0b11111111111111111111111111111111111111111111111111111') // 9007199254740991n
산술 연산
BigInt
자료형의 산술 연산은 대부분 Number
자료형의 연산과 동일하게 작동하고, 연산 결과는 BigInt
타입의 값을 반환한다.
다만, 나눗셈 연산의 결과 소수점 이하를 모두 버린다는 것에 주의하자. 만일 소수점 이하의 값을 보존하고 싶다면 별도의 라이브러리(bigdecimal.js
)를 설치하여 이를 구현할 수 있다고 한다.
BigInt
자료형은 Number
자료형과 섞어서 연산할 수 없다. 섞어서 사용해야 하는 상황이라면 Number()
나 BigInt()
를 통해 자료형을 통일해주도록 한다. 이 때, BigInt
를 Number()
로 변환할 때 값이 너무 커서 Number
자료형에서 허용하는 범위를 초과한다면 잘못된 값이 반환될 수 있다는 점에 주의하자.
const biggest = 10n;
console.log(biggest + 35n) // 45n
console.log(biggest / 3n) // 3n
console.log(biggest + 35) // TypeError
비교 연산
비교 연산자 <
, >
는 BigInt
자료형과 Number
자료형 모두에 사용할 수 있다.
이 때, 동등 연산자와 일치 연산자의 차이에 주목할 필요가 있다.
동등 연산자(==)는 피연산자의 타입이 다를 때 비교를 위해 형변환을 한 뒤 비교를 한다. 따라서 값이 같다면 타입이 달라도 동등하다고 판단한다.
반대로 일치 연산자(===)는 피연산자의 타입이 달라도 형변환을 하지 않기 때문에 값이 같고 타입이 같을 때만 일치하다고 판단한다.
이러한 이유로 값이 같은 BigInt
자료형과 Number
자료형을 비교할 때 동등 연산자를 사용하면 true
가, 일치 연산자를 사용하면 false
가 반환된다.
console.log(35n < 40n) // true
console.log(35n < 40) // true
console.log(35n == 35) // true
console.log(35n === 35) // false
논리 연산
&&
, ||
등의 논리 연산에 대해서도 동일하게 작동한다.
console.log(1n && 3) // 3
console.log(0n || 5n) // 5n
console.log(0n ? 'truthy' : 'falsy') // falsy
--
🙇🏻♂️ https://ko.javascript.info/bigint
🙇🏻♂️ https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt