BigInt

남성윤·2023년 1월 17일
0

학습 일지

목록 보기
11/369

개요

이전 포스트에서 가볍게 다뤘듯, Number값이 안정적으로 다룰 수 있는 최대치의 숫자는 2^53 - 1이다. 이를 바로 보여주는것이

9007199254740992 === 9007199254740993 // true 

이다. 2^53 - 1을 정수로 풀면 9007199254740991인데, 이 위로는 소수점 무한소수처럼 근사치로 저장되기 때문에, 두 숫자가 다름에도 같다고 인식되는것이다. 그렇다면 이보다 큰 정수를 표현하려면 어떻게 해야할까?

BigInt

내장 객체, BigInt를 사용함으로써, 2^53 - 1보다 큰 정수를 표현할 수 있다. BigInt는 길이 제한 없이 정수를 나타낼 수 있는데, 생성하는 방법은 단순히 정수 뒤에 n을 붙이는 방법과, BigInt()를 호출해 생성하는 방법이다.

const BigNumber1 = BigInt(1);
const BigNumber2 = 2n;

위와 같은 방식으로 생성할 수 있는데, BigInt()를 호출해서 생성 시 주의점은 애초에 괄호 안에 들어가는 숫자가 2^53 - 1보다 크다면 근사치가 BigInt로 생성된다는 점이다. 이 부분을 인지하지 않으면

BigInt(9007199254740993) === 9007199254740993n // false

위와 같은 상황이 발생할 수 있다.

Number와의 비교점

BigIntNumber와 유사점이 많지만, 차이점도 꽤나 많다.

1. 함께 연산할 수 없다!

+, -, *, /, %, ** 등의 연산자를 이용할 때, 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

2. 연산은 할 수 없지만, 동등한 값으로서 처리

'10' > 9n
1 < 2n
10 > '9'
'2' == 2n
2 == 2n
2 == '2'

// 위 예시 전부 true로 작동.

연산에서는 섞이지 않지만, 비교에서는 동등한 값으로서 위와 같이 사용할 수 있다.

3. 소수점 이하는 사용하지 않는다!

말 그대로 BigInt에서는 소수점 이하를 사용하지 않고, 연산 과정에서 생기는 소수점 이하는 모두 버림처리하게 된다.

3n / 4n === 0n // true

이외 부분의 연산에서는 모두 일반적 정수 연산과 동일하게 작동한다.

결론

2^53 - 1만 해도 굉장히 큰 수이기 때문에 BigInt는 사실 자주 사용되지는 않을 것으로 보여지지만 때때로 사용하게 된다면

  1. BigInt끼리의 연산만 가능하다.
  2. 소수점은 사용하지 못한다.

두가지만 잘 유의해서 사용한다면 제한이 없는 특성상, 특정 상황에 도움이 될 수 있겠다.

profile
안녕하세요, Blog 2022.06 ~

0개의 댓글