JavaScript에는 서로 다른 두 가지 종류의 숫자가 있어요. 바로 숫자와 "bigint"예요.
숫자는 가장 많이 쓰이며, 배정밀도 64비트 부동소수점 형식의 숫자 데이터 타입을 나타내요.
number: 배정밀도 64비트 부동소수점 형식(IEEE 754)의 숫자 데이터 타입이에요.
예를 들어 -6, -2.4, 0, 0.1, 1, 3.14, 16.984025, 25, 976, 1024.0, 500000 등이 있어요.bigint: 임의 정밀도 형식으로 _정수_를 표현할 수 있는 숫자 데이터 타입이에요.
예를 들어 -12n, 0n, 4n, 9007199254740991n 등이 있어요.let numericValue = 42;
// => 42
JavaScript 코드에서 42와 같은 숫자 리터럴은 정수가 아니라 부동소수점 값이에요.
일상적으로 흔히 쓰이는 별도의 정수 타입은 없어요.
bigint 타입은 일상적인 용도로 number 타입을 대체하도록 설계된 게 아니에요.
42는 여전히 BigInt가 아니라 Number예요.
숫자는 0b101, 0o13, 0x0A 같은 리터럴 형식으로도 표현할 수 있어요. 숫자 어휘 문법에 대해서는 여기에서 더 알아봐요.
E 표기법은 어떤 수에 10의 거듭제곱을 곱한 값을 나타내요.
E 표기법의 형식은 숫자 뒤에 e 또는 E를 쓰고, 그 뒤에 곱할 10의 거듭제곱을 쓰는 거예요.
const num = 3.125e7;
// => 31250000
// The notation essentially says, "Take 3.125 and multiply it by 10^7".
E 표기법은 아주 작은 수를 나타낼 때도 쓸 수 있어요.
const num = 325987e-6; // Equals 0.325987
// The notation essentially says, "Take 325987 and multiply it by 10^-6.
밑줄을 사용하면 큰 수를 읽기 쉽게 만들 수 있어요. 컴파일러는 밑줄을 완전히 무시해요.
const num = 1_000_000; // You can read this as 1,000,000
console.log(num);
// => 1000000
숫자를 다룰 때 유용한 내장 객체가 두 가지 있어요.
Number: 흔히 쓰는 유용한 값들을 위한 정적 속성, 타입 검사와 타입 변환을 위한 정적 메서드, 그리고 타입 변환과 숫자를 문자열로 포맷하기를 위한 인스턴스 메서드가 있어요.Math: 수학 상수와 함수를 위한 속성과 메서드가 있지만, BigInt와는 작동하지 않아요.Math에는 숫자를 반올림하는 메서드도 있어요.
사용할 수 있는 반올림 옵션에 대해서는 반올림에 관한 javascript.info 글에서 더 읽어볼 수 있어요.
Math.floor(234.34); // => 234
Math.ceil(234.34); // => 235
Number 내장 전역 object는 거의 모든 숫자 비슷한 값을 number로 변환하는 데 쓸 수 있는 전역 function이기도 해요.
string을 number로 _파싱_하는 것보다 더 엄격해요.
const date = new Date('December 17, 1995 03:24:00');
const unix = Number(date);
unix;
// => 819199440000
JavaScript 숫자에는 최댓값(그리고 최솟값 / 최대 음수값)을 나타내는 세 가지 종류가 있어요.
VALUE: Number.MAX_VALUE와 Number.MIN_VALUE가 여기에 해당해요.INFINITY: Number.POSITIVE_INFINITY와 Number.NEGATIVE_INFINITY가 여기에 해당해요.SAFE_INTEGER: Number.MAX_SAFE_INTEGER와 Number.MIN_SAFE_INTEGER가 여기에 해당해요.JavaScript에서 숫자가 구현되는 방식 때문에 Number.MIN_VALUE와 Number.MAX_VALUE 사이의 모든 수가 표현될 수 있는 건 아니에요.
하지만 Number.MIN_SAFE_INTEGER - 1과 Number.MAX_SAFE_INTEGER + 1 사이의 모든 수는 표현할 수 있어요.
JavaScript에는 몇 가지 특수한 숫자 값이 있어요.
NaN과 Infinity라는 두 가지 오류 값이 있어요.+0과 -0이라는 두 가지 값이 있어요.오류 값 NaN("숫자가 아님"의 줄임말)은 다음과 같은 경우에 생겨요.
Number('123'); // => 123
Number('Hello, World!'); // => NaN
Math.sqrt(-64); // => NaN
NaN + 69; // => NaN
NaN은 자기 자신과 같지 않은 유일한 값이에요.
NaN === NaN; // => false
어떤 값이 NaN인지 확인하고 싶다면 전역 함수 isNaN()을 사용해야 해요.
isNaN(NaN); // => true
isNaN(123); // => false
Infinity는 두 가지 문제 중 하나를 나타내는 오류 값이에요.
Math.pow(2, 1024); // => Infinity
6 / 0; // => Infinity
-6 / 0; // => -Infinity
Infinity는 (NaN을 제외하면) 다른 어떤 수보다 커요.
마찬가지로 -Infinity는 (NaN을 제외하면) 다른 어떤 수보다 작아요.
전역 함수 isFinite()를 사용하면 어떤 값이 (무한도 NaN도 아닌) 실제 수인지 확인할 수 있어요.
isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false
+0과 -0은 JavaScript에서 서로 다른 수예요. 0과 구별할 수 없을 만큼 아주 작은 수를 표현하면 이들이 생길 수 있어요.
부호 있는 0을 사용하면 0에 "어느 방향에서" 다가갔는지, 즉 그 수가 0으로 취급되기 전에 어떤 부호를 가졌는지를 기록할 수 있어요.
가장 좋은 방법은 0이 하나뿐이라고 가정하는 거예요.
수는 값이 같으면 서로 같은 것으로 간주해요.
1 == 1.0;
// => true
1 === 1.0;
// => true
// Remember, all numbers are floating-points, so this is
// different syntax for the exact same value.
1 === 1n;
// => false
// Strictly checking a number against a bigint will always result
// in false.
일반적인 비교와 JavaScript에서 숫자 값을 비교하는 방법에 대한 자세한 내용은 비교를 참고해요.
JavaScript의 숫자는 부동소수점 수이기 때문에, 이 값들을 사용하는 모든 연산은 부동소수점 연산이에요. 따라서 JavaScript에서는:
0.1 + 0.2 === 0.3;
// => false
간단한 설명은 0.30000000000000004.com에서, 자세한 설명은 Oracle의 Numerical Computation Guide "What Every Computer Scientist Should Know About Floating-Point Arithmetic"의 부록 D에서 볼 수 있어요.