2 분 소요

자바스크립트 Number 객체는 웹 개발에서 숫자를 다룰 때 꼭 이해해야 하는 핵심 개념입니다. 이 글에서는 64비트 부동소수점 구조부터 Infinity, NaN, 진법 변환, Number 래퍼 객체까지 Number 객체의 모든 것을 한눈에 정리했습니다.


Number 객체란?

자바스크립트의 모든 숫자는 64비트 부동소수점(IEEE 754) 형식으로 저장됩니다.

비트 구분 내용
1비트 부호(Sign)
11비트 지수(Exponent)
52비트 가수(Mantissa)

정수는 최대 15자리, 소수는 약 17자리까지 정확하지만, 그 이상은 오차가 발생할 수 있습니다.

let exact = 999_999_999_999_999; // ✔ 정확
let inexact = 9_999_999_999_999_999; // ❌ 10000000000000000

부동소수점 정밀도와 오차 해결법

0.1 + 0.2 문제를 통해 오차를 확인해봅니다.

let sum = 0.1 + 0.2; // 0.30000000000000004
let fix = (0.1 * 10 + 0.2 * 10) / 10; // 0.3
  • 원인: 2진수에서 0.1, 0.2를 정확히 표현할 수 없음
  • 해결: 정수화 → 연산 → 다시 나누기(스케일링) 또는 toFixed, BigInt·사설 라이브러리 활용

toString()으로 손쉽게 진법 변환

const num = 256;
num.toString(2); // "100000000"  (2진수)
num.toString(8); // "400"        (8진수)
num.toString(16); // "100"        (16진수)

toString(진법)은 문자열로 변환만 할 뿐, 실제 숫자 타입은 변하지 않습니다.


Infinity와 NaN 제대로 이해하기

Infinity

10 / 0; //  Infinity
1 / Infinity; //  0
  • 0으로 나누거나 표현 범위를 초과하면 무한대(Infinity)가 반환됩니다.

NaN (Not-a-Number)

100 - "text"; // NaN
0 / 0; // NaN
isNaN(NaN); // true
  • 수학적으로 정의되지 않은 결과
  • Number.isNaN()을 사용하면 암묵 변환 없이 정확히 검사 가능

null·undefined·Number 객체 구분하기

의미 typeof 결과 불리언 변환
null “값 없음” "object" false
undefined “정의 안 됨” "undefined" false
NaN 숫자 아님 "number" false
Infinity 무한대 "number" true
const a = 100; // 숫자 리터럴
const b = new Number(100); // Number 객체

typeof a; // "number"
typeof b; // "object"

a == b; // true
a === b; // false

Number 객체는 래퍼 객체라서 성능·가독성 측면에서 추천되지 않습니다.


핵심 요약

  • 부동소수점: 15 ~ 17자리만 정확, 오차 발생 가능
  • 진법 변환: num.toString(2) 등으로 문자열 출력
  • Infinity: 무한대, 0으로 나눌 때 등장
  • NaN: 계산 불가능한 숫자
  • null·undefined: “값 없음” vs “정의 안 됨”
  • Number 객체: 특별한 경우 외엔 사용 지양

질문 정리

Q1. 0.1 + 0.2 오차를 항상 방지하려면?

A. 정수 변환(스케일링)·BigInt·소수 지원 라이브러리를 사용하거나 toFixed() 등으로 보정합니다.

Q2. parseInt("08")이 8이 아닌 경우가 있던데?

A. ES5 이전 브라우저에서 8진수로 해석될 수 있습니다. 반드시 parseInt("08", 10)처럼 기수(10)를 명시하세요.

Q3. Number.MAX_SAFE_INTEGER의 값은?

A. 9 007 199 254 740 991 (2^53 − 1)로, 그 이상부터는 정수 오차가 발생합니다.

Q4. isNaN()Number.isNaN()의 차이점은?

A. isNaN()암묵 변환 후 검사, Number.isNaN()엄격 검사(NaN만 true)로 더 안전합니다.

Q5. Infinity를 비교 연산에 사용해도 괜찮나요?

A. 가능합니다. 모든 유한한 숫자보다 크거나 작다는 성질을 이용해 경계값 체크를 간단히 구현할 수 있습니다.

카테고리:

업데이트:

댓글남기기