[JavaScript] 자바스크립트의 숫자 타입

숫자 타입

가장 기본적인 숫자 리터럴 형식은 10진법이다.

1
var intNum = 7;		// 정수

정수는 8진수[1]나 16진수로도 초기화할 수 있다. 단, 8진수 리터럴의 경우 첫 숫자가 반드시 0이어야 하며 16진수 리터럴의 경우 첫 두 문자에 반드시 0x를 써야 한다.

1
2
var octalNum = 070		// 8진법으로 쓴 56
var hexNum = 0xA // 16진수로 쓴 10

8진수, 16진수와는 상관없이 실제 계산할 때에는 10진수로 변환하여 계산한다.


부동소수점

다음과 같이 사용할 수 있다.

1
2
3
var floatNum1 = 1.1;
var floatNum2 = 3.24;
var floatNum3 = .7; // 유효하나 권장하지 않는다.

부동소수점 숫자를 저장할 때에는 정수 저장에 비해 메모리를 두 배로 소모한다. 만약 소수점 뒤에 숫자가 없다면 해당 숫자는 정수로 변환된다.

굉장히 크거나 작은 숫자를 표기할 때에는 'e-표기법[2]’을 쓴다. 이 표기법은 e 앞의 숫자에 10을 e 뒤의 숫자만큼 곱하는 것이다. 31,250,000은 var floatNum = 3.125e7;로 표기할 수 있으며, 0.0000003은 var floatnum = 3e-7;로 표기할 수 있다.

그러나 부동소수점 숫자는 사칙 연산에 있어 부정확하다. 예를 들어, 0.1과 0.2를 더하면 0.30000000000000004를 반환한다. 고로 다음의 코드와 같은 형식을 사용해서는 안 된다.

1
2
3
if(a + b == 0.3) {		// 이렇게 작성하면 안 된다.
alert("0.3!");
}

숫자 범위

ECMAScript로 표현할 수 있는 최솟값은 Number 객체의 MIN_VALUE 프로퍼티(Number.MIN_VALUE)에 저장된다. 이 값은 브라우저마다 다르지만 보통 5e-324이다. 최댓값은 MAX_VALUE 프로퍼티에 저장되며, 보통 1.7976931348623157e+308이다. 계산 결과가 범위를 벗어날 때에는 양수는 Infinity로, 음수는 -Infinity로 변환된다.

만약, 특정 변수가 유한한 숫자임을 확인하고 싶다면 다음과 같이 사용하면 된다.

1
2
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); // false

드문 경우이긴 하나, 굉장히 크거나 작은 숫자를 계산할 때에는 반드시 모니터링해야 한다.


NaN

숫자형 값 중 NaN[3]이란 특별한 값이 있다. 숫자를 반환할 것으로 의도한 조작이 실패했을 때 반환하는 값이다. ECMAScript에서는 숫자를 0으로 나누려 할 때 NaN을 반환[4]한다. NaN에는 몇 가지 특징이 있다.

  1. NaN이 포함된 조작(NaN/10 등의 조작)은 항상 NaN을 반환한다.
  2. NaN은 어떤 값과도 일치하지 않는다. alert(NaN == NaN);의 결과는 false이다.

때문에 ECMAScript에서는 isNaN() 함수를 제공한다.

1
2
3
4
alert(isNaN(NaN));		// true
alert(isNaN(10)); // false: 10은 숫자.
alert(isNaN("blue")) // true: "blue"를 숫자로 바꿀 수 없다.
alert(isNaN(true)); // false: 숫자 1로 바꿀 수 있다.

숫자 변환

함수 Number(), parseInt(), parseFloat()는 숫자가 아닌 값을 숫자로 바꾼다.


Number()

  • boolean 값은 1과 0(true, false)으로 바꿔 반환한다.
  • 정수는 정수로 반환한다.
  • null은 0으로 반환한다.
  • undefined는 NaN으로 반환한다.
  • 매개변수로 문자열을 넘겼다면
    • 문자열 구성이 모두 숫자 -> 숫자 반환
    • 부동소수점 -> 앞의 정수만 반환
    • 문자열이 16진수 -> 해당하는 10진수 반환
    • 빈 문자열 -> 0 반환
    • 이외의 경우 -> NaN 반환
1
2
3
4
var num1 = Number("Hello World");		// NaN
var num2 = Number(""); // 0
var num3 = Number("000011"); // 11
var num4 = Number(true); // 1

parseInt()

첫 문자가 숫자라면 10, 8, 16진수를 인식하고 그에 맞게 변환한다. 만약 숫자+문자의 형태라면, 앞의 숫자만 반환한다.

1
2
3
4
5
6
var num1 = parseInt("7BTOB");		// 7
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 16진수 10
var num4 = parseInt(22.5); // 22
var num5 = parseInt("70"); // 70
var num6 = parseInt("0xf"); // 16진수 15

숫자형의 형식이 다양해 혼란을 야기할 수 있으므로 parseInt()에는 진법을 나타내는 두 번째 매개변수를 넘길 수 있다. 만약 파싱하려는 값이 16진수임을 알고 있다면 var num = parseInt("0xAF", 16)[5]과 같이 16진수임을 명확하게 알릴 수 있다.


parseFloat()

이 함수는 문자열에서 잘못된 부동소수점 숫자를 만날 때까지 파싱한다. 예를 들어, "12.3.21"을 넘길 경우 12.3만 반환한다. 예시는 다음과 같다.

1
2
3
4
5
6
var num1 = parseFloat("7BTOB");			// 7
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num4 = parseFloat("12.3.21"); // 12.3
var num5 = parseFloat("03.21"); // 3.21
var num6 = parseFloat("3.125e7"); // 31250000


이 포스트의 모든 내용은 프론트엔드 개발자를 위한 자바스크립트 프로그래밍(인사이트) 책을 참고하여 작성되었습니다.




  1. 스트릭트 모드에서는 8진법 리터럴을 허용하지 않아 문법 에러가 발생한다. ↩︎

  2. 지수 표기법 ↩︎

  3. Not a Number ↩︎

  4. 다른 프로그래밍 언어에서는 일반적으로 에러를 반환한다. ↩︎

  5. 16진수임을 표기했기에 문자열에 0x가 포함되지 않아도 정상 동작한다. ↩︎

Share