문제의 발단

부동소수점에 대해 복습하던 중, 웹 개발 주력 언어인 Javascript의 소수점 처리 방식이 궁금해졌다.

Typescript를 사용해본 독자들은 number 원시 타입에 익숙할 것이다.

그렇다면 number 타입은 어느 범위의 숫자를 지원할까?


Number

Javascript가 최대 및 최소로 표현할 수 있는 숫자는 MAX_VALUE, MIN_VALUE 속성으로 파악 가능하다.

console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE);

JS Max, Min Value

 

즉, 해당 값을 넘어가면 오차가 발생하거나 infinity로 판단된다.

부동소수점에 대한 자세한 내용은 CS 파트에서 다루겠다.

그렇다면, 범위를 늘리려면 어떻게 해야할까? → `Bigint` 자료형을 사용해보자.


Bigint

BigIntNumber 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.

 

BigInt는 정수 리터럴의 뒤에 `n`을 붙이거나(10n) 함수 `BigInt()`를 호출해 생성할 수 있다.

const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n

속성

수학 연산자

BigInt는 대개 일반 숫자와 큰 차이 없이 사용할 수 있다.

console.log(1n + 2n); // 3

 

주의점

  1. 나눗셈 연산자에서는 소수부가 없다.
  2. `BigInt` 값과 일반 숫자를 섞어서 사용할 수 없다
    형 변환을 통해 자료형을 동일하게 설정해주어야 한다.
  3. `+` 연산자를 사용하면, `Number` 범위 외 비트는 잘려나간다.
    → 따라서, `bigint`는 `+` 연산자를 지원하지 않는다.
// #1
console.log(5n / 2n); // 2

// #2. 
console.log(1n + 2); // Error: Cannot mix BigInt and other types

// 형 변환
alert(1n + BigInt(2)); // 3
alert(Number(1n) + 2); // 3

// #3. + 연산자 사용 불가
alert( +2n ); // 에러

비교 연산자

  1. `>` `<` 모두 사요 가능하며, `Number`와 동일하게 작용한다.
  2. `Number` 자료형과 비교하는 경우, `==` 는 작동하나, `===` 는 false를 도출한다.
// #1. > <
console.log( 2n > 1n ); // true
console.log( 2n > 1 ); // true

// #2. == and ===
console.log( 1 == 1n ); // true
console.log( 1 === 1n ); // false

논리 연산자

`Number`와 동일하게 작동한다.

if (0n) {
  // 실행 X
}

console.log( 1n || 2 ); // 1 (truthy)
console.log( 0n || 2 ); // 2 (falsy)

Typescript

version 3.2 부터 `bigint`를 사용가능하다.

const num: bigint = 10n;

const num2: bigint = Bigint(10);

 

 


결론

그렇다면 항상 Bigint를 사용하는 것이 좋을까?

Bigint는 Number에 비해 연산과정이 오래걸린다.

시간적 소요는 성능에 영향을 끼치므로, 꼭 필요한 경우에만 사용하도록 하자.

+ Recent posts