number 타입 심층 분석, JavaScript 숫자의 특성과 한계
JavaScript에서 숫자 데이터는 모두 number
타입으로 처리됩니다. 이는 다른 언어들과 달리 정수와 실수의 구분 없이 하나의 타입으로 모든 수치를 다룬다는 점에서 간결하지만, 내부적으로는 IEEE-754 64비트 부동소수점 포맷을 따르기 때문에 정밀도와 표현 범위에 한계가 존재합니다. 이 글에서는 JavaScript number 타입의 구조, 숫자 표현의 한계, 안전한 수학 연산 방법을 코드와 표를 활용해 깊이 있게 알아봅니다.
목차
- JavaScript에서의 number란?
- number의 내부 구조: IEEE-754
- 정밀도의 한계와 부동소수점 오류
- 안전한 정수 범위와 Number.MAX_SAFE_INTEGER
- NaN, Infinity, -Infinity의 의미
- 수학 유틸리티와 Math 객체 활용
- 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
'프로그래밍 언어 > 자바스크립트' 카테고리의 다른 글
JavaScript null을 활용한 조건문 최적화 전략 (0) | 2025.04.30 |
---|---|
JavaScript BigInt란? 대용량 정수 연산을 쉽게 처리하는 법 (0) | 2025.04.24 |
true와 false의 세계, JavaScript boolean (0) | 2025.04.12 |
JavaScript 데이터 타입의 특성, null은 왜 객체인가? (0) | 2025.04.06 |
JavaScript에서 큰 숫자를 다루는 방법, BigInt 개념과 활용법 (0) | 2025.03.31 |