[javascript] 자바스크립트가 표현할 수 있는 숫자의 범위?

insung·2025년 9월 24일

JavaScript의 숫자형과 안전한 정수(Safe Integer)

1. Number 타입

  • JavaScript는 다른 언어와 달리 정수(Integer)와 실수(Float)를 구분하지 않음.
  • Number 라는 단일 타입으로 모든 숫자를 표현.
  • Number 타입은 64비트 부동소수점 형식(double-precision 64-bit binary format) 인 IEEE 754 표준을 따름

    이러한 특징 때문에 정수처럼 보이는 숫자도 사실은 부동소수점 형태로 저장.
    예를 들어, 10은 내부적으로 10.0과 같이 처리.

2. 안전한 정수(Safe Integer)

  • Number 타입이 64비트 부동소수점 형식으로 표현되다 보니, 모든 정수를 정확하게 표현할 수 있는 것은 아님.
  • JavaScript가 정확하게 표현할 수 있는 최대 정수와 최소 정수의 범위를 바로 '안전한 정수'라고 함

안전한 정수의 범위
최대 안전 정수: 2^53 - 1
최소 안전 정수: -(2^53 - 1)

console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991

3. Safe Integer를 넘어서는 경우의 문제점

  • 만약 Number.MAX_SAFE_INTEGER를 초과하는 값을 사용하면?
let maxSafe = Number.MAX_SAFE_INTEGER;
console.log(maxSafe); // 9007199254740991

let beyondSafeAgain = maxSafe + 2;
console.log(beyondSafeAgain); // 9007199254740992 <- 2가 증가하였지만, 정확한 표현이 되지 못함
  • 이는 64비트 부동소수점 표현 방식의 한계로 인해 발생하는 정밀도 손실 때문.
  • 큰 정수 값을 다룰 때 이와 같은 문제가 발생하면 예상치 못한 버그로 이어질 수 있음

4. BigInt

  • 이러한 문제는 ES2020에 도입된 BigInt 타입은 이러한 문제를 해결.
  • BigInt는 Number의 안전한 정수 범위를 넘어선 큰 정수도 정확하게 표현할 수 있도록 해줌
  • BigInt는 숫자 뒤에 n을 붙여서 선언하거나, BigInt() 함수를 사용해 생성할 수 있음
const largeNumber = 9007199254740991n; // 숫자 뒤에 'n'을 붙여 BigInt 타입으로 선언
console.log(largeNumber); // 9007199254740991n

const a = BigInt(Number.MAX_SAFE_INTEGER) + 1n;
console.log(a); // 9007199254740992n

const b = BigInt(Number.MAX_SAFE_INTEGER) + 2n;
console.log(b); // 9007199254740993n

BigInt는 Number 타입과 연산할 수 없기 때문에 주의해야
같은 BigInt 타입끼리만 연산이 가능

profile
안녕하세요 프론트엔드 관련 포스팅을 주로 하고 있습니다

0개의 댓글