[Javascript] Number
JS Number, JavaScript 숫자, double precision
정의
JavaScript 의 number 는 IEEE 754 double-precision float (64-bit). 정수와 실수를 같은 타입으로 표현. 정수 안전 범위는 ±2^53 - 1.
typeof 42 // 'number'
typeof 3.14 // 'number'
typeof NaN // 'number'
typeof Infinity // 'number'
정수 안전 범위
Number.MAX_SAFE_INTEGER // 9007199254740991 (2^53 - 1)
Number.MIN_SAFE_INTEGER // -9007199254740991
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
// 안전 범위 초과
9007199254740992 + 1 // 9007199254740992 (정확도 손실!)
큰 정수는 BigInt 사용.
부동소수점 함정
0.1 + 0.2 === 0.3 // ❌ false
0.1 + 0.2 // 0.30000000000000004
이진 표현으로 0.1, 0.2 가 정확히 표현 안 됨. 통화 등은 정수 단위 (cent) 로 다룰 것.
Math.abs((0.1 + 0.2) - 0.3) < Number.EPSILON // 비교 idiom
특수 값
| 값 | 의미 |
|---|---|
Infinity | 1/0, 너무 큰 수 |
-Infinity | -1/0 |
NaN | 0/0, 의미 없는 수치 연산 |
Number.EPSILON | 2^-52 ≈ 2.22e-16 |
NaN
NaN === NaN // ❌ false
Number.isNaN(NaN) // ✓ true
isNaN('hello') // true (강제 변환 후)
Number.isNaN('hello') // false (엄격)
Number.isNaN 권장 (변환 없이 검사).
형변환
Number('42') // 42
Number('42.5') // 42.5
Number('') // 0
Number(' ') // 0
Number('hello') // NaN
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number([]) // 0
Number([1]) // 1
Number([1, 2]) // NaN
parseInt('42px') // 42 (관대)
parseFloat('3.14em') // 3.14
parseInt('hello') // NaN
parseInt('10', 2) // 2 (binary)
정수 검사
Number.isInteger(42) // true
Number.isInteger(42.0) // true (값이 정수면)
Number.isInteger(42.5) // false
Number.isInteger('42') // false (string)
Number.isSafeInteger(2**53) // false (안전 범위 초과)
진법 변환
(255).toString(16) // 'ff'
(255).toString(2) // '11111111'
parseInt('ff', 16) // 255
parseInt('11111111', 2) // 255
0xff // 255 (16진 리터럴)
0b11111111 // 255 (2진)
0o777 // 511 (8진, ES6)
포맷팅
(1234567.89).toLocaleString() // '1,234,567.89'
(1234567.89).toLocaleString('de-DE') // '1.234.567,89'
(1234567.89).toLocaleString('ko-KR', { style: 'currency', currency: 'KRW' })
// '₩1,234,568'
(0.1234).toFixed(2) // '0.12' (string)
(0.1234).toPrecision(3) // '0.123'
Math
Math.PI // 3.141592...
Math.E // 2.718...
Math.abs(-5) // 5
Math.round(0.5) // 1
Math.floor(0.9) // 0
Math.ceil(0.1) // 1
Math.trunc(-1.9) // -1 (정수부만)
Math.sign(-3) // -1
Math.max(1, 2, 3) // 3
Math.min(...arr) // spread 활용
Math.random() // 0 ≤ x < 1
Math.pow(2, 10) // 1024 (또는 2**10)
Math.sqrt(16) // 4
Math.log(Math.E) // 1
Math.log2(8) // 3
Math.log10(1000) // 3
함정
1. 0 의 양수/음수
0 === -0 // true
1 / 0 // Infinity
1 / -0 // -Infinity
Object.is(0, -0) // false (구분)
2. parseInt 의 radix
parseInt('010') // 10 (modern), 8 (legacy)
parseInt('010', 10) // 10 (명시 권장)
3. 큰 정수의 손실
const id = 12345678901234567;
console.log(id); // 12345678901234568 (마지막 자리 변형)
// 큰 ID 는 string 또는 BigInt 로
참고
이 글의 용어 (3개)
- [Javascript] 타입 변환 / 강제 변환javascript
- 정의 JavaScript 의 암묵적 형변환 (coercion). 연산자가 양쪽 피연산자의 타입을 자동으로 맞춘다. 명시적 변환과 구분. 3 가지 강제 변환 1. ToString …
- [Javascript] BigIntjavascript
- 정의 는 임의 정밀도 정수. 를 넘어가는 정수를 정확히 표현. ES2020 도입. 왜 필요한가 큰 ID, 암호화, 정밀 산술, 통화 (cent 기반 정수) 에 안전. 사용 함정:…
- [Javascript] NaN / Infinityjavascript
- 정의 - (Not a Number) : 의미 없는 수치 연산의 결과 - , : 너무 큰/작은 수, 0 으로 나누기 IEEE 754 표준에 따른 특수 값. 타입이지만 특이한 동작.…
💬 댓글