숫자 타입
가장 기본적인 숫자 리터럴 형식은 10진법이다.
1 | var intNum = 7; // 정수 |
정수는 8진수[1]나 16진수로도 초기화할 수 있다. 단, 8진수 리터럴의 경우 첫 숫자가 반드시 0이어야 하며 16진수 리터럴의 경우 첫 두 문자에 반드시 0x를 써야 한다.
1 | var octalNum = 070 // 8진법으로 쓴 56 |
8진수, 16진수와는 상관없이 실제 계산할 때에는 10진수로 변환하여 계산한다.
부동소수점
다음과 같이 사용할 수 있다.
1 | var floatNum1 = 1.1; |
부동소수점 숫자를 저장할 때에는 정수 저장에 비해 메모리를 두 배로 소모한다. 만약 소수점 뒤에 숫자가 없다면 해당 숫자는 정수로 변환된다.
굉장히 크거나 작은 숫자를 표기할 때에는 '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 | if(a + b == 0.3) { // 이렇게 작성하면 안 된다. |
숫자 범위
ECMAScript로 표현할 수 있는 최솟값은 Number 객체의 MIN_VALUE 프로퍼티(Number.MIN_VALUE)에 저장된다. 이 값은 브라우저마다 다르지만 보통 5e-324이다. 최댓값은 MAX_VALUE 프로퍼티에 저장되며, 보통 1.7976931348623157e+308이다. 계산 결과가 범위를 벗어날 때에는 양수는 Infinity로, 음수는 -Infinity로 변환된다.
만약, 특정 변수가 유한한 숫자임을 확인하고 싶다면 다음과 같이 사용하면 된다.
1 | var result = Number.MAX_VALUE + Number.MAX_VALUE; |
드문 경우이긴 하나, 굉장히 크거나 작은 숫자를 계산할 때에는 반드시 모니터링해야 한다.
NaN
숫자형 값 중 NaN[3]이란 특별한 값이 있다. 숫자를 반환할 것으로 의도한 조작이 실패했을 때 반환하는 값이다. ECMAScript에서는 숫자를 0으로 나누려 할 때 NaN을 반환[4]한다. NaN에는 몇 가지 특징이 있다.
- NaN이 포함된 조작(NaN/10 등의 조작)은 항상 NaN을 반환한다.
- NaN은 어떤 값과도 일치하지 않는다.
alert(NaN == NaN);
의 결과는 false이다.
때문에 ECMAScript에서는 isNaN() 함수를 제공한다.
1 | alert(isNaN(NaN)); // true |
숫자 변환
함수 Number(), parseInt(), parseFloat()는 숫자가 아닌 값을 숫자로 바꾼다.
Number()
- boolean 값은 1과 0(true, false)으로 바꿔 반환한다.
- 정수는 정수로 반환한다.
- null은 0으로 반환한다.
- undefined는 NaN으로 반환한다.
- 매개변수로 문자열을 넘겼다면
- 문자열 구성이 모두 숫자 -> 숫자 반환
- 부동소수점 -> 앞의 정수만 반환
- 문자열이 16진수 -> 해당하는 10진수 반환
- 빈 문자열 -> 0 반환
- 이외의 경우 -> NaN 반환
1 | var num1 = Number("Hello World"); // NaN |
parseInt()
첫 문자가 숫자라면 10, 8, 16진수를 인식하고 그에 맞게 변환한다. 만약 숫자+문자의 형태라면, 앞의 숫자만 반환한다.
1 | var num1 = parseInt("7BTOB"); // 7 |
숫자형의 형식이 다양해 혼란을 야기할 수 있으므로 parseInt()에는 진법을 나타내는 두 번째 매개변수를 넘길 수 있다. 만약 파싱하려는 값이 16진수임을 알고 있다면 var num = parseInt("0xAF", 16)
[5]과 같이 16진수임을 명확하게 알릴 수 있다.
parseFloat()
이 함수는 문자열에서 잘못된 부동소수점 숫자를 만날 때까지 파싱한다. 예를 들어, "12.3.21"을 넘길 경우 12.3만 반환한다. 예시는 다음과 같다.
1 | var num1 = parseFloat("7BTOB"); // 7 |
✯ 이 포스트의 모든 내용은 프론트엔드 개발자를 위한 자바스크립트 프로그래밍(인사이트) 책을 참고하여 작성되었습니다.