본문 바로가기

프로그래밍 언어/자바스크립트

number 타입 심층 분석, JavaScript 숫자의 특성과 한계

number 타입 심층 분석, JavaScript 숫자의 특성과 한계

JavaScript에서 숫자 데이터는 모두 number 타입으로 처리됩니다. 이는 다른 언어들과 달리 정수와 실수의 구분 없이 하나의 타입으로 모든 수치를 다룬다는 점에서 간결하지만, 내부적으로는 IEEE-754 64비트 부동소수점 포맷을 따르기 때문에 정밀도와 표현 범위에 한계가 존재합니다. 이 글에서는 JavaScript number 타입의 구조, 숫자 표현의 한계, 안전한 수학 연산 방법을 코드와 표를 활용해 깊이 있게 알아봅니다.

 

 

목차

  1. JavaScript에서의 number란?
  2. number의 내부 구조: IEEE-754
  3. 정밀도의 한계와 부동소수점 오류
  4. 안전한 정수 범위와 Number.MAX_SAFE_INTEGER
  5. NaN, Infinity, -Infinity의 의미
  6. 수학 유틸리티와 Math 객체 활용
  7. BigInt: 대안으로서의 초정밀 정수형

 

1. JavaScript에서의 number란?

JavaScript의 모든 숫자는 기본적으로 number 타입이며, 정수(integer)실수(floating point)를 구분하지 않습니다.

  • 정수 예: let a = 10;
  • 실수 예: let b = 3.14;
  • 기타 표현: 지수형 let c = 1.23e5;

이 통합된 숫자 타입은 간결하지만, 때때로 정밀도 손실을 야기할 수 있습니다.

 

 

 

2. number의 내부 구조: IEEE-754

JavaScript는 숫자를 표현하기 위해 IEEE-754 double-precision (64-bit) 부동소수점 포맷을 사용합니다.

구성 요소 비트 수 설명
Sign 1 양수/음수 여부
Exponent 11 지수
Fraction 52 가수(소수 부분)

 

 

 

3. 정밀도의 한계와 부동소수점 오류

자주 언급되는 예시는 다음과 같습니다:

console.log(0.1 + 0.2);  // 출력: 0.30000000000000004
  

이 현상은 부동소수점 연산의 정밀도가 제한되기 때문입니다. 해결 방법으로는 다음이 있습니다:

  • 소수점 반올림: Number((0.1 + 0.2).toFixed(2))
  • 정수 기반 연산: (10 + 20) / 100

 

 

 

4. 안전한 정수 범위와 Number.MAX_SAFE_INTEGER

JavaScript에서 정확히 표현 가능한 정수는 ±(253 - 1)까지입니다.

  • Number.MAX_SAFE_INTEGER → 9007199254740991
  • Number.MIN_SAFE_INTEGER → -9007199254740991

범위를 초과하는 경우 정수 간 비교나 연산에서 오류가 발생할 수 있습니다.

 

 

 

 

5. NaN, Infinity, -Infinity의 의미

number 타입은 다음의 특별한 값을 포함합니다:

  • NaN: Not-a-Number, 연산 실패 시 반환
  • Infinity: 무한대 (예: 1 / 0)
  • -Infinity: 음의 무한대
console.log(0 / 0);         // NaN
console.log(1 / 0);         // Infinity
console.log(-1 / 0);        // -Infinity
console.log(NaN === NaN);   // false!
  

isNaN()Number.isFinite()를 통해 유효성 검사를 수행할 수 있습니다.

 

 

 

6. 수학 유틸리티와 Math 객체 활용

JavaScript는 Math 내장 객체를 통해 다양한 수학 함수를 제공합니다.

  • Math.round(), Math.floor(), Math.ceil()
  • Math.pow(), Math.sqrt(), Math.abs()
  • Math.random() → 0 이상 1 미만 난수 생성
console.log(Math.pow(2, 3));   // 8
console.log(Math.sqrt(16));   // 4
console.log(Math.round(2.6)); // 3
  

 

 

 

7. BigInt: 대안으로서의 초정밀 정수형

BigInt정확한 초대형 정수를 표현할 수 있는 새로운 데이터 타입입니다.

  • 표현 범위 제한 없이 정수 연산 가능
  • 리터럴 뒤에 n을 붙여 사용: 12345678901234567890n
  • number와 직접 연산은 불가 (명시적 변환 필요)
const big = 9007199254740992n;
console.log(big + 1n);  // 9007199254740993n