숫자

숫자 에서 JavaScript

20개의 연습 문제

숫자 소개

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

내장 객체

숫자를 다룰 때 유용한 내장 객체가 두 가지 있어요.

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과 -0이라는 두 가지 값이 있어요.

NaN - 숫자가 아님

오류 값 NaN("숫자가 아님"의 줄임말)은 다음과 같은 경우에 생겨요.

  • 수를 파싱할 수 없을 때:
    Number('123'); // => 123
    Number('Hello, World!'); // => NaN
    
  • 연산이 실패했을 때:
    Math.sqrt(-64); // => NaN
    
  • 피연산자 중 하나가 NaN일 때:
    NaN + 69; // => NaN
    

NaN은 자기 자신과 같지 않은 유일한 값이에요.

NaN === NaN; // => false

어떤 값이 NaN인지 확인하고 싶다면 전역 함수 isNaN()을 사용해야 해요.

isNaN(NaN); // => true
isNaN(123); // => false

Infinity

Infinity는 두 가지 문제 중 하나를 나타내는 오류 값이에요.

  • 수의 크기가 너무 커서 표현할 수 없을 때.
    Math.pow(2, 1024); // => Infinity
    
  • 0으로 나누기가 일어났을 때.
    6 / 0; // => Infinity
    -6 / 0; // => -Infinity
    

Infinity는 (NaN을 제외하면) 다른 어떤 수보다 커요. 마찬가지로 -Infinity는 (NaN을 제외하면) 다른 어떤 수보다 작아요.

전역 함수 isFinite()를 사용하면 어떤 값이 (무한도 NaN도 아닌) 실제 수인지 확인할 수 있어요.

isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false

두 개의 0

+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에서 볼 수 있어요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

숫자 배우기

연습이 잠겨 있어요

숫자 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요