ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript의 큰 수 다루기 : BigInt
    공부라도 하자 2023. 8. 26. 16:15

    BigInt

    BigInt 값은 일반 숫자 원시값(primitive)으로 처리하기에는 너무 큰 정수를 나타내는 데 사용됩니다.

    BigInt 값은 정수 리터럴 뒤에 n을 추가하거나 정수나 문자열 값을 사용하여 BigInt() 함수를 호출하여 생성할 수 있습니다.

    📌 여기서 “너무 큰 정수”는 자바스크립트에서 사용할 수 있는
    최대 정수인 Number.MAX_SAFE_INTEGER (2⁵³ - 1) 보다 큰 수를 나타낸다.
    💡 자바스크립트의 원시 타입
    객체가 아니고 메서드나 속성이 없는 데이터
    string, number, bigint, boolean, undefined, symbol, null 

     

    사용

    BigInt 값은 정수 리터럴 뒤에 **n**을 추가하거나 정수나 문자열 값을 사용하여 BigInt() 함수를 호출하여 생성할 수 있습니다.

    const hugeNumber = 1234567890123456789012345678901234567890n;
    const alsoHuge = BigInt("1234567890123456789012345678901234567890");

     

    연산자

    BigInt 값은 일반 숫자와 유사하게 사용할 수 있지만, 몇 가지 중요한 차이점이 있습니다. BigInt 값은 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본 산술 연산을 지원합니다.

    + * - % **

    const bigA = 100n;
    const bigB = 200n;
    
    const sum = bigA + bigB; // 300n
    const product = bigA * bigB; // 20000n
    const bigN = 2n ** 54n; // 18014398509481984n
    • 나눗셈 연산자의 경우, 결과 값이 소숫점을 포함할 경우 소수 자릿수를 반환하지 않고 정수로 잘립니다.
    const expected = 4n / 2n;
    // 2n
    
    const truncated = 5n / 2n;
    // 2n, not 2.5n

     

    비교

    BigInt 값은 Number 값과 완전히 동일하지는 않지만 대략적으로는 다음과 같습니다 .

    • 동등 비교(==, equality operator) : O
    • 일치 비교(===, strict equality operator) : X
    0n === 0; // false
    0n == 0; // true

    Number 값과 BigInt 값은 비교가 가능하며, 같은 배열에서 정렬될 수 있습니다.

    1n < 2; // true
    2n > 1; // true
    2 > 2; // false
    2n > 2; // false
    2n >= 2; // true
    const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
    // [4n, 6, -12n, 10, 4, 0, 0n]
    
    mixed.sort(); // default sorting behavior
    // [ -12n, 0, 0n, 10, 4n, 4, 6 ]
    
    mixed.sort((a, b) => a - b);
    // won't work since subtraction will not work with mixed types
    // TypeError: can't convert BigInt value to Number value
    
    // sort with an appropriate numeric comparator
    mixed.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
    // [ -12n, 0, 0n, 4n, 4, 6, 10 ]

     

    강제 변환

    1. 제한된 사용: BigInt는 일반 숫자의 안전한 정수 범위인 $2^{53}$보다 큰 값에 대해 사용하는 것이 좋습니다.
    2. 정밀도 손실: BigInt와 숫자 값 간의 변환은 정밀도 손실을 초래할 수 있습니다. 이러한 유형 간 변환 시 주의가 필요합니다.
    3. Math 객체: BigInt 값은 내장된 Math 객체의 메서드와 함께 사용할 수 없으며, 명시적인 강제 변환 없이 숫자 값과 혼합해서 사용할 수 없습니다.

     

    조건문

    BigInt 값은 다음과 같은 경우에 number와 동일한 변환 규칙을 따릅니다.

    • Boolean으로 변환될 때
    • 논리 연산자 (||, &&, !)와 함께 사용될 때
    • if 문과 같은 조건부 테스트 내에서

    즉, 0n만 거짓(falsy)이며, 나머지 값은 참(truthy)입니다.

    if (0n) {
      console.log("Hello from the if!");
    } else {
      console.log("Hello from the else!");
    }
    // "Hello from the else!"
    
    0n || 12n; // 12n
    0n && 12n; // 0n
    Boolean(0n); // false
    Boolean(12n); // true
    !12n; // false
    !0n; // true
    


    참고 자료

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

    https://developer.mozilla.org/en-US/docs/Glossary/Primitive

Designed by Tistory.