이전 포스트에서 가볍게 다뤘듯, Number
값이 안정적으로 다룰 수 있는 최대치의 숫자는 2^53 - 1이다. 이를 바로 보여주는것이
9007199254740992 === 9007199254740993 // true
이다. 2^53 - 1
을 정수로 풀면 9007199254740991
인데, 이 위로는 소수점 무한소수처럼 근사치로 저장되기 때문에, 두 숫자가 다름에도 같다고 인식되는것이다. 그렇다면 이보다 큰 정수를 표현하려면 어떻게 해야할까?
내장 객체, BigInt
를 사용함으로써, 2^53 - 1보다 큰 정수를 표현할 수 있다. BigInt는 길이 제한 없이 정수를 나타낼 수 있는데, 생성하는 방법은 단순히 정수 뒤에 n
을 붙이는 방법과, BigInt()
를 호출해 생성하는 방법이다.
const BigNumber1 = BigInt(1);
const BigNumber2 = 2n;
위와 같은 방식으로 생성할 수 있는데, BigInt()
를 호출해서 생성 시 주의점은 애초에 괄호 안에 들어가는 숫자가 2^53 - 1보다 크다면 근사치가 BigInt로 생성된다는 점이다. 이 부분을 인지하지 않으면
BigInt(9007199254740993) === 9007199254740993n // false
위와 같은 상황이 발생할 수 있다.
BigInt
는 Number
와 유사점이 많지만, 차이점도 꽤나 많다.
+
, -
, *
, /
, %
, **
등의 연산자를 이용할 때, BigInt
는 기본적으로 다른 타입과 섞이지 않도록 만들어져 있다.
type
의 구분에 느슨한 JavaScript
에서는 특기할 점이라 할 수 있다.
1 + '1' // '11'
1 - '1' // 0
2 * '2' // 4
2 ** '4' // 16
2 / '2' // 1
3 % '2' // 1
2 + 2n // TypeError: Cannot mix BigInt and other types
'10' > 9n
1 < 2n
10 > '9'
'2' == 2n
2 == 2n
2 == '2'
// 위 예시 전부 true로 작동.
연산에서는 섞이지 않지만, 비교에서는 동등한 값으로서 위와 같이 사용할 수 있다.
말 그대로 BigInt
에서는 소수점 이하를 사용하지 않고, 연산 과정에서 생기는 소수점 이하는 모두 버림처리하게 된다.
3n / 4n === 0n // true
이외 부분의 연산에서는 모두 일반적 정수 연산과 동일하게 작동한다.
2^53 - 1
만 해도 굉장히 큰 수이기 때문에 BigInt는 사실 자주 사용되지는 않을 것으로 보여지지만 때때로 사용하게 된다면
BigInt
끼리의 연산만 가능하다.두가지만 잘 유의해서 사용한다면 제한이 없는 특성상, 특정 상황에 도움이 될 수 있겠다.