본문 바로가기

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

JavaScript 숫자 연산 이해하기, number 타입 활용법

JavaScript 숫자 연산 이해하기, number 타입 활용법

JavaScript에서 숫자 연산은 가장 기초적이면서도 의외로 오류를 범하기 쉬운 부분입니다. 단순히 더하고 빼는 계산을 넘어서, 내부 동작 방식과 자료형의 특징을 이해하면 코드의 안정성과 성능이 향상됩니다.

이번 글에서는 JavaScript의 number 타입에 대해 단순한 공식 암기에서 벗어나, 근본적인 원리와 실제 사례를 통해 깊이 있게 살펴봅니다. 특히 부동소수점 연산, 타입 변환, 특별한 수치 값(NaN, Infinity 등)까지 폭넓게 다루어 여러분의 숫자 연산 실력을 한층 끌어올리겠습니다.

 

 

목차

  1. number 타입의 특징
  2. 부동소수점 연산의 함정
  3. NaN과 Infinity, 언제 등장하는가?
  4. 숫자 연산과 타입 변환의 관계
  5. BigInt와 number의 차이점
  6. Math 객체로 숫자 다루기
  7. 안전한 숫자 연산을 위한 팁

 

1. number 타입의 특징

JavaScript의 number 타입은 64비트 IEEE 754 부동소수점 형식으로 표현됩니다. 이는 다음과 같은 특징을 가집니다:

  • 정수와 실수를 모두 동일한 타입으로 처리
  • 범위: 약 ±1.7976931348623157 × 10³⁰⁸
  • 특수한 값: NaN, Infinity, -Infinity

예시:

let integer = 42;
let float = 3.14;
console.log(typeof integer); // "number"
console.log(typeof float);   // "number"

 

 

 

2. 부동소수점 연산의 함정

JavaScript의 부동소수점 연산은 정확하지 않은 결과를 종종 반환합니다. 이는 컴퓨터가 10진수를 2진수로 변환하는 과정에서 발생하는 근사 오차 때문입니다.

대표적인 예시:

console.log(0.1 + 0.2);  // 0.30000000000000004
console.log(0.3 === 0.1 + 0.2); // false

Tip: 정밀 비교가 필요할 땐 Math.abs(a - b) < Number.EPSILON을 활용하세요.

 

 

 

3. NaN과 Infinity, 언제 등장하는가?

등장 조건 설명
NaN 0/0, 잘못된 연산 숫자가 아님(Not a Number), 비교 불가능 (NaN !== NaN)
Infinity 양수를 0으로 나눌 때 무한대
-Infinity 음수를 0으로 나눌 때 음의 무한대

주의해야 할 점:

  • Number.isNaN()으로 정확히 NaN 판별
  • isFinite()Infinity 여부 확인

 

 

 

4. 숫자 연산과 타입 변환의 관계

JavaScript는 암묵적 타입 변환(Coercion)을 통해 숫자가 아닌 값도 숫자처럼 처리할 수 있습니다. 대표적 사례:

console.log('5' * 2); // 10 (문자열 '5'가 숫자로 변환됨)
console.log('5' + 2); // "52" (덧셈 연산 시 문자열로 변환)

주의: 산술 연산 시 암묵적 변환으로 인한 의도치 않은 결과가 발생할 수 있으므로, Number()parseInt() 등을 명시적으로 사용하는 것이 안전합니다.

 

 

 

 

5. BigInt와 number의 차이점

BigInt는 매우 큰 정수를 안전하게 표현할 수 있는 타입입니다.

특징 number BigInt
범위 약 ±9,007,199,254,740,991 (2⁵³-1) 제한 없음 (메모리 크기 제한)
정밀도 부동소수점 오차 있음 정확한 정수 연산
사용 방법 42 42n

주의: BigIntnumber 타입은 직접 연산이 불가능하므로 명시적 변환 필요.

 

 

 

6. Math 객체로 숫자 다루기

JavaScript의 Math 객체는 숫자 연산을 도와주는 다양한 함수들을 제공합니다.

  • Math.round(), Math.floor(), Math.ceil(): 반올림, 내림, 올림
  • Math.random(): 난수 생성
  • Math.max(), Math.min(): 최댓값, 최솟값 찾기
  • Math.pow(), Math.sqrt(): 제곱, 제곱근 계산

예시:

console.log(Math.max(1, 5, 10)); // 10
console.log(Math.random() * 100); // 0~99 난수

 

 

 

7. 안전한 숫자 연산을 위한 팁

  1. 부동소수점 오차 주의 → 정밀 계산 시 toFixed() 또는 외부 라이브러리 활용
  2. 암묵적 타입 변환 지양 → 항상 명시적 변환 사용
  3. NaN 체크Number.isNaN() 필수
  4. 무한 루프 방지Infinity 발생 조건 확인
  5. 큰 정수 연산은 BigInt 사용