자바스크립트 Math 객체 사용법: 메소드·상수
자바스크립트 Math 객체는 난수 생성부터 삼각함수·로그 계산까지 모든 수학 연산을 책임지는 내장 도구입니다. new 연산자 없이 정적(static) 메소드로 바로 호출할 수 있어, 코드가 간결하면서도 강력합니다.
Math 객체란? — 생성자 없는 수학 전용 유틸리티
- 생성자 없음 →
new Math()❌ - 정적 메소드·상수 →
Math.min(),Math.PI처럼 즉시 사용 - 브라우저·Node.js 모두 지원하는 표준 API
실수·정수 간 구분 없이 모든 숫자를 64비트 부동소수점으로 처리하므로, 부동소수점 오차(0.1 + 0.2 ≠ 0.3)가 발생할 수 있음에 유의하세요.
가장 많이 쓰는 Math 메소드
| 분류 | 메소드 | 기능 요약 | 사용 예 |
|---|---|---|---|
| 최솟값 | Math.min() |
가장 작은 값 | Math.min(1, -5, 3) → -5 |
| 최댓값 | Math.max() |
가장 큰 값 | Math.max(1, -5, 3) → 3 |
| 난수 | Math.random() |
0 ≤ x < 1 | Math.random() → 0.123… |
| 반올림 | Math.round() |
4.5↑ 올림, 4.4↓ 버림 | Math.round(4.6) → 5 |
| 올림/내림 | Math.ceil() / Math.floor() |
소수점 ↑↓ | Math.ceil(4.1) → 5Math.floor(4.9) → 4 |
| 삼각함수 | Math.sin() 등 |
라디안 입력 | Math.sin(Math.PI/2) → 1 |
🎲 난수 생성 — 범위 지정 공식
// min 이상 max 미만 랜덤
function getRandom(min, max) {
return Math.random() * (max - min) + min;
}
console.log(getRandom(10, 20)); // 10 ≤ x < 20
TIP : 정수 난수가 필요하면 Math.floor() 또는 Math.round()를 조합하세요.
반올림·절댓값·거듭제곱 — 실전 계산 메소드
| 메소드 | 설명 | 예시 |
|---|---|---|
Math.abs(x) |
절댓값 | Math.abs(-7) → 7 |
Math.pow(x, y) |
xʸ 거듭제곱 | Math.pow(2,3) → 8 |
Math.sqrt(x) / Math.cbrt(x) |
√x / ∛x | Math.sqrt(9) → 3 |
Math.trunc(x) |
소수점 제거 | Math.trunc(3.14) → 3 |
Math.sign(x) |
부호 (-1, 0, 1) | Math.sign(-10) → -1 |
Math.hypot(...a) |
피타고라스 | Math.hypot(3,4) → 5 |
삼각함수·역함수·각도 변환
// 삼각함수 (라디안)
Math.sin(Math.PI / 2); // 1
Math.cos(0); // 1
Math.tan(Math.PI / 4); // 1
// 역삼각함수
Math.asin(1); // 1.570796…
Math.acos(0); // 1.570796…
Math.atan(1); // 0.785398…
// 각도 → 라디안
const deg = 90;
const rad = deg * (Math.PI / 180);
라디안·도(degree)를 혼동하지 않도록 변환 공식을 기억하세요.
로그·지수 계산 메소드
| 메소드 | 설명 | 예시 |
|---|---|---|
Math.log(x) |
ln(x) | Math.log(Math.E) → 1 |
Math.log10(x) |
log₁₀(x) | Math.log10(1000) → 3 |
Math.log2(x) |
log₂(x) | Math.log2(8) → 3 |
Math.exp(x) |
eˣ | Math.exp(1) → 2.718… |
Math 상수 모음
| 상수 | 의미 | 값(대략) |
|---|---|---|
Math.PI |
π | 3.14159 |
Math.E |
오일러 상수 | 2.71828 |
Math.SQRT2 |
√2 | 1.41421 |
Math.SQRT1_2 |
1/√2 | 0.70711 |
Math.LN2 |
ln 2 | 0.69314 |
Math.LN10 |
ln 10 | 2.30259 |
Math.LOG2E |
log₂ e | 1.44269 |
Math.LOG10E |
log₁₀ e | 0.43429 |
실전 활용 팁 5가지
- 정규분포 랜덤 →
Box–Muller공식으로Math.random()두 번 호출 - 통계 계산 →
Math.min/Math.max(...arr)+ 스프레드 문법 - 소수점 오차 보정 → 반올림
Math.round(value * 100) / 100 - 부동소수점 검사 →
Number.isSafeInteger()+Math.trunc()조합 - FPS 계산 →
1000 / deltaTime반올림으로 실시간 프레임 표시
요약 테이블
| 카테고리 | 대표 메소드 |
|---|---|
| 비교 | Math.min(), Math.max() |
| 반올림 | round(), ceil(), floor() |
| 난수 | random() |
| 지수·거듭제곱 | pow(), exp() |
| 루트 | sqrt(), cbrt() |
| 삼각함수 | sin(), cos(), tan() |
| 로그 | log(), log10(), log2() |
| 상수 | Math.PI, Math.E, … |
질문 정리
-
Math.random()으로 “정수” 난수를 얻으려면?
// 0 이상 n 이하 정수 const randInt = Math.floor(Math.random() * (n + 1)); -
부동소수점 오차를 줄이는 가장 쉬운 방법은?
스케일링 기법—정수로 변환해 연산 후 다시 나누기—을 사용하거나,
toFixed()로 출력 값을 보정하세요. -
Math.pow() 대신 거듭제곱 연산자(
*)를 써도 되나요?네, ES2016 이상 환경에선
x ** y가 더 간결하고 성능도 동일합니다. -
라디안-도 변환을 반복 계산하면 느려지나요?
변환 자체는 단순 곱셈·나눗셈이라 부담이 적지만, 반복 호출 시 상수(180/π) 를 변수에 캐싱하면 미세 성능을 개선할 수 있습니다.
-
Math 객체를 직접 확장해도 괜찮을까요?
가능하지만 전역 충돌 위험이 큽니다.
Math.myFunc = …보다는 유틸 모듈 또는 클래스 내부에 정의하는 방법을 추천합니다.
댓글남기기