ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript/기초
    [JS] 자바스크립트 숫자 체계 이해하기 (64비트 부동소수점, 정수, 실수, BigInt 등)
    2024. 11. 18. 23:15

     

     

    Javascript

     

    자바스크립트의 숫자는 기본적으로 하나의 자료형(number)으로 관리되며, 부동소수점 체계에 기반합니다. 이번 포스팅에서는 자바스크립트의 숫자 체계가 어떻게 구성되어 있는지, 그리고 어떤 특성을 가지고 있는지 살펴보겠습니다.

     

    단일 숫자 자료형

    자바스크립트의 모든 숫자는 number 자료형을 사용하며, 정수와 실수 모두 IEEE 754 64비트 부동소수점 형식으로 저장됩니다. 이 체계는 64비트 중 52비트가 가수부, 11비트가 지수부, 그리고 1비트가 부호비트를 사용하여 양수와 음수를 표현합니다. 이러한 구조로 인해 자바스크립트에서 정수와 실수는 구분되지 않고, 모든 숫자는 동일한 number 형식으로 처리됩니다.

     

     

     

    정수 범위와 안전한 정수

    부동소수점 표현 방식으로 인해 자바스크립트에서 표현 가능한 정확한 정수 범위는 약 ±2^53 - 1(±9007199254740991)까지입니다. 이 범위를 넘어가는 숫자는 정밀도를 잃어, 정확하게 표현되지 않습니다. 이를 자바스크립트에서는 안전한 정수라고 부르며, Number.isSafeInteger() 함수를 통해 숫자가 안전한 범위 내에 있는지 확인할 수 있습니다.

    console.log(Number.isSafeInteger(9007199254740991)); // true
    console.log(Number.isSafeInteger(9007199254740992)); // false
    

     

     

     

    부동소수점 연산의 특성

    자바스크립트는 모든 숫자를 부동소수점으로 저장하기 때문에, 실수 연산 시 정밀도 손실이 발생할 수 있습니다.

    예를 들어, 0.1 + 0.2는 예상과 다르게 0.30000000000000004가 됩니다. 이는 부동소수점 체계의 한계로, 이 문제를 해결하기 위해서는 Number.EPSILON과 같은 값을 활용하여 소수점 오차를 감지하거나 toFixed() 등을 이용해 결과를 조정할 수 있습니다.

    console.log(0.1 + 0.2 === 0.3); // false
    console.log(Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON); // true

     

     

    특수 숫자 값: NaN, Infinity, -Infinity

     

    자바스크립트의 숫자 체계는 몇 가지 특수한 값들도 포함합니다.

    • NaN: 숫자가 아님을 나타내며, 예를 들어 숫자 형식이 아닌 문자열을 숫자로 변환하려고 할 때 발생합니다. NaN은 자기 자신과도 같지 않으므로, Number.isNaN()을 통해 확인하는 것이 좋습니다.
    • Infinity-Infinity: 양의 무한대와 음의 무한대를 나타냅니다. 0으로 나누거나, 매우 큰 값을 다룰 때 생깁니다.
    console.log(Number.isNaN(NaN)); // true
    console.log(1 / 0); // Infinity
    console.log(-1 / 0); // -Infinity

     

     

    BigInt로 큰 정수 다루기

    기존의 number 자료형으로 표현할 수 있는 안전한 정수 범위를 넘어서야 하는 경우, 자바스크립트는 BigInt라는 자료형을 제공합니다. BigInt는 거의 무한대에 가까운 정수를 표현할 수 있으며, n을 숫자 끝에 붙여 사용할 수 있습니다.

    const bigNumber = 9007199254740991n;
    console.log(bigNumber + 1n); // 9007199254740992n

     

    BigInt는 일반적인 number와 호환되지 않으므로, 연산 시 서로 다른 자료형 간의 혼용에 주의해야 합니다.

     

     

    자바스크립트의 이진 표현과 정밀도 문제

    자바스크립트는 이진 부동소수점 체계를 사용하기 때문에 10진 소수를 정확하게 표현하지 못하는 경우가 있습니다.

    예를 들어, 0.1과 0.2는 이진 부동소수점에서 정확히 표현되지 않아 연산 시 오차가 발생합니다. 이러한 문제는 특히 금액 계산과 같이 정밀한 계산이 필요한 경우 주의해야 하며, 이를 해결하기 위해 정수로 변환하여 계산하거나 라이브러리를 활용하는 방식이 자주 사용됩니다.

     

     

    결론

     

    자바스크립트의 숫자 체계는 단일 number 자료형을 통해 정수와 실수를 모두 다루며, BigInt를 통해 대규모 정수 연산도 지원합니다. 그러나 부동소수점 체계의 특성상 정밀도 문제가 발생할 수 있으며, 안전한 정수 범위 내에서 작업하거나, 정밀도가 중요한 경우 적절한 대처가 필요합니다. 이를 이해하고 활용하는 것은 자바스크립트에서 신뢰성 있는 계산 로직을 작성하는 데 큰 도움이 됩니다.

Designed by Tistory.