ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Section 9. 자바스크립트 BigInt
    자바스크립트 2023. 4. 6. 16:50

    Number.MAX_SAFE_INTEGER 더 큰 정수를 다루기 위한 자료형이다. 

    매우 큰 정수를 다뤄야 하는 특수한 경우에 사용한다.

    console.log(
      Number.MAX_SAFE_INTEGER
    ); //9007199254740991
    for (let i = 0; i < 100; i++) {
      console.log(Number.MAX_SAFE_INTEGER + i);
    }

    출력문을 보면 다음과 같다

    자바스크립트의 방식으로는 이 이상의 숫자를 표현하기가 매우 어렵다. 그래서 이런 정수들보다 더 큰 값을 다룰때는 아래의 방법들로 한다.

    const bigInt1 = 9007199254740991n; // 끝에 n을 붙임
    const bigInt2 = BigInt(9007199254740991);
    const bigInt3 = BigInt('9007199254740991');
    const bigInt4 = BigInt(0x1fffffffffffff) // 9007199254740991
    
    console.log(typeof bigInt1); //bigint

     bigint 자료형으로 큰 정수를 생성을 했고 (bigInt === bigInt2 === bigInt3 ===bigInt4 이다) 이것을 똑같이 for문으로 돌려보면 다음과 같다.

    for (let i = 0; i < 100; i++) {
      console.log(bigInt1 + BigInt(i));
    }

    잘 출력이 되는 것을 확인할 수 있다.

     

    BigInt의 특징들

    일반 number 타입과 산술 (+, -, *, /, %, **) 연산이 불가능하다.

    console.log(
      1n + 1
    ); 애러
    
    console.log(
      1n + 1n
    ); //2n

    따라서 양쪽 모두 BigInt로 변환하여 계산하는 방법을 사용한다.

    // 양쪽 모두 BigInt로 변환하여 계산하는 방법 사용
    const calcAsBigInt = (x, y, op) => {
      return op(BigInt(x), BigInt(y));
    }
    
    console.log(
      calcAsBigInt(1n, 1, (x, y) => x + y)
    ); //2n

     

    비교 연산은 가능하다. 

    console.log(
      1n === 1, // 타입은 다름
      1n == 1,
      1n < 2,
      1n >= 0,
      2n < 1
    ); //false true true true false

    number 숫자와 섞여 정렬이 가능하다.

    console.log(
      [4n, 7, 6n, 3, 1, 5, 9, 2n, 8n]
      .sort((a, b) => a > b ? 1 : -1)
    ); //[1, 2n, 3, 4n, 5, 6n, 7, 8n, 9]

    불리언으로 변환되는 연산이 가능하다.

    console.log(
      !!(0n),
      !!(1n)
    ); //false, true

    소수점 아래는 버린다.

    console.log(
      5n / 2n
    ); //2n

    Math의 정적 메서드에서 사용이 불가능하다.

    console.log(
      Math.max(1n, 2n)
    ); //애러

    number로 변환이 가능하지만... - 정확성 유실에 주의해야 한다.

    console.log(
      Number(1n),
      Number(9007199254740993n)
    ); //1 9007199254740992

    MAX_SAFE_INTEGER 보다 더 큰 값을 넣었더니 정확성이 유실되었다.

Designed by Tistory.