본문 바로가기

Language/Javascript

[Javascript] 지수 표기법으로 출력되는 JavaScript 숫자, 왜 그럴까? (feat. Number vs BigInt)

728x90
반응형

최근에 자바스크립트로 팩토리얼을 계산하는 코드를 짜다가 흥미로운 문제를 마주했다.
팩토리얼 계산 결과가 지수 표기법으로 출력된 것이다.

 

function extraLongFactorials(n) {
    let answer = 1;
    for(let i = n; i >= 1; i--){
        answer *= i;
    }
    console.log(answer);  // 1.5511210043330984e+25
}


1.5511210043330984e+25 같은 숫자. 이게 도대체 뭘까?

🔍 지수 표기법이란?

1.5511210043330984e+25는 15511210043330985984000000와 같은 숫자다.
e+25는 "10의 25제곱을 곱한다"는 뜻이고, 자바스크립트는 너무 큰 숫자를 간단하게 표현하려고 이렇게 보여준다.

❓ 왜 이런 표기로 나올까?

자바스크립트의 기본 숫자 타입인 Number는 64비트 부동소수점 형식이라
대략 15~17자리 정도까지만 정확하게 표현할 수 있다.
그래서 n!처럼 큰 숫자를 계산하면 자동으로 지수 표기법으로 바뀌는 것!

🛠 해결 방법: BigInt를 쓰자!

큰 숫자를 정확하게 다루고 싶다면 BigInt를 사용하면 된다.
BigInt는 정수의 크기에 제한 없이 계산할 수 있는 타입이다.

function extraLongFactorials(n) {
    let answer = BigInt(1);
    for(let i = BigInt(n); i >= BigInt(1); i--){
        answer *= i;
    }
    console.log(answer);  // 15511210043330985984000000n
}

💡 그런데 왜 n이 붙지?

BigInt 타입은 숫자 뒤에 n을 붙여서 표현한다. n은 일반 숫자가 아니라 BigInt라고 명시하는 역할을 한다.

toString()을 통해문자열로 변환하면 n 없이 출력할 수 있다.

function extraLongFactorials(n) {
    let answer = BigInt(1);
    for(let i = BigInt(n); i >= BigInt(1); i--){
        answer *= i;
    }
    console.log(answer.toString());  // 15511210043330985984000000
}
728x90
반응형