숫자

자바스크립트의 모든 숫자(정수와 부동 소수점 수)는 모두 Number 타입이다.

자바스크립트의 모든 숫자는 부동 소수점 수로 표현되며, 자바스크립트에서는 IEEE 754 규격에 정의된 64비트 부동 소수점 형태로 숫자를 표현한다.

숫자 리터럴

자바스크립트 프로그램에서 숫자가 직접 나타날 경우 그것을 숫자 리터럴(numerical literal)이라 한다. 자바스크립트에서는 다음과 같은 형식을 지원한다.

자바스크립트 숫자 리터럴의 예는 다음과 같다.

var number1 = 1;            
var number2 = 0;            
var number3 = 999999999;    
var number4 = 0xff;
var number5 = 010;
var number6 = 3.14159265;
var number7 = 5e5;      // 과학적 표기법
var number8 = 5E-5;     // 과학적 표기법

console.log("number1 = " + number1);
console.log("number2 = " + number2);
console.log("number3 = " + number3);
console.log("number4 = " + number4);
console.log("number5 = " + number5);
console.log("number6 = " + number6);
console.log("number7 = " + number7);
console.log("number8 = " + number8);

위 예제를 실행한 결과는 다음과 같다.

number1 = 1
number2 = 0
number3 = 999999999
number4 = 255
number5 = 8
number6 = 3.14159265
number7 = 500000
number8 = 0.00005

무한대

어떤 숫자가 유한수에서 표현 가능한 가장 큰 수보다 클 경우 Infinity가 나온다. 어떤 음수가 표현 가능한 마지막 음수보다 작을 경우 -Infinity가 나온다.

숫자를 0으로 나눠도 Infinity가 나오는데, 다음 예제를 보자.

var number1 = 1/0;          // Infinity
var number2 = -1/0;         // -Infinity

isFinite() 함수는 어떤 숫자가 Infinity(양의 Infinity 또는 음의 Infinity)가 아닌지 검사하는 데 사용된다.

console.log(isFinite(1/0));     // false
console.log(isFinite(-1/0));    // false
console.log(isFinite("a"));     // false
console.log(isFinite(NaN));     // false
console.log(isFinite(1));       // true

Infinity에 값을 더하거나 빼더라도 값은 바뀌지 않는다.

console.log(Infinity == Infinity);      // true
console.log(Infinity == Infinity+10);   // true
console.log(Infinity == Infinity-10);   // true

NaN

수학 연산을 수행할 수 없을 경우(예: 0을 0으로 나누는) NaN(not-a-number)이 반환된다.

NaN은 자기 자신을 포함해 다른 어떤 숫자와도 같은지 비교할 수 없으며, 어떤 값이 NaN인지 검사할 때는 isNaN() 함수를 사용한다.

NaN을 이용하는 예제는 다음과 같다.

console.log(0/0);           // NaN
console.log(isNaN(0/0));    // true
console.log(isNaN(NaN));    // true
console.log(isNaN("a"));    // true
console.log(isNaN(123));    // false
console.log(NaN == NaN);    // false
console.log(NaN == 1);      // false

숫자를 문자열로 변환

자동 변환

문자열 연결 수식에서 숫자가 사용될 경우 해당 숫자는 자동으로 문자열로 변환된다.

var str1 = 50 + " meters";  // 50 meters
var str2 = 50 + "";

String() 함수를 이용한 변환

숫자를 문자열로 명시적으로 변환하는 방법은 String() 함수를 사용하는 것이다.

var number1 = 50;
var string1 = String(number1);
console.log(number1.length);    // undefined
console.log(string1.length);    // 2

toString() 메서드를 이용한 변환

숫자를 문자열로 변환하는 또 한 가지 방법은 toString() 메서드를 사용하는 것이다.

var number1 = 500;
var string1 = number1.toString();
console.log(number1.length);    // undefined
console.log(string1.length);    // 3

toFixed(), toExponential(), toPrecision()

var n = 123456.789;
console.log(n.toFixed(0));      //123457
console.log(n.toFixed(2));      //123456.79
console.log(n.toExponential(1));//1.2e+5
console.log(n.toExponential(3));//1.235e+5
console.log(n.toPrecision(4));  //1.235e+5
console.log(n.toPrecision(6));  //123457
console.log(n.toPrecision(7));  //123456.8

문자열을 숫자로 변환

자동 변환

숫자 컨텍스트에서 문자열이 사용되면 해당 문자열은 자동으로 숫자로 변환된다. 다음 예제를 보자.

console.log("50"*"5");  // 250
console.log(+"50");     // 50
console.log(+" 50 ");   // 50, 숫자 앞과 뒤의 공백은 무시됨
console.log("50"-0);    // 50
console.log(+"50abc");  // NaN, 숫자로 변환할 수 없음

Number() 생성자를 이용한 변환

문자열을 숫자로 변환하는 명시적이고 엄격한 방법은 Number() 생성자를 호출하는 것이다. 이 경우 숫자의 앞과 뒤에 공백이 포함될 수 있지만 문자열 내에 비공백 문자가 나타나서는 안 된다.

console.log(Number("50"));      // 50
console.log(Number("50.55"));   // 50.55
console.log(Number(" 50 "));    // 50
console.log(Number(" 50abc"));  // NaN
console.log(Number("abc50"));   // NaN
console.log(Number("0x50"));    // 80, 16진수
console.log(Number("0xff"));    // 255, 16진수

parseInt()와 parseFloat()을 이용한 변환

문자열을 숫자로 변환하는 유연한 방법은 parseInt()와 parseFloat()을 사용하는 것이다. 이 두 함수는 문자열 초기에 나오는 숫자를 변환해서 반환하는데, 이때 숫자 뒤에 이어지는 내용은 무시한다. parseInt()는 정수만을 파싱하는 반면, parseFloat()은 정수와 부동 소수점 수를 모두 파싱한다.

console.log(parseInt("50 meters")); // 50
console.log(parseInt("50.55"));     // 50
console.log(parseInt(" 50 "));      // 50
console.log(parseInt(" 50abc"));    // 50
console.log(parseInt("abc50"));     // NaN
console.log(parseInt("0x50"));      // 80, 16진수
console.log(parseInt("0xff"));      // 255, 16진수
console.log(parseInt("010"));       // 8이나 10, 브라우저에 따라 다름
console.log(parseFloat(" 50.55 meters"));   // 50.55
console.log(parseFloat("$50.55 dollars"));  // NaN

참고: ECMAScript 명세에서는 문자열이 ?0?(?0x?나 ?0X?가 아닌)으로 시작할 경우 parseInt()에서는 그것을 8진수나 10진수로 파싱할 수도 있다고 명시하고 있다. 그러므로 앞에 0이 붙은 숫자를 파싱할 때는 parseInt()를 사용해서는 안 된다.

부정확한 계산

자바스크립트에서는 부동 소수점 수(예: 0.1)를 정확히 이진수로 표현할 수 없기 때문에 부동 소수점 계산이 부정확한 측면이 있다. 다음 예제는 그러한 부정확성을 보여준다.

console.log(0.1 + 0.2 == 0.3);          // false
console.log(0.1 + 0.2);                 // 0.30000000000000004
console.log((0.1 + 0.2).toFixed(30) );  // 0.300000000000000044408920985006

0.1과 0.2를 정확히 더하기 위해서는 먼저 두 숫자를 정수로 만든 다음 계산을 하는 방법이 있다.

console.log(0.1*10 + 0.2*10 == 0.3*10); // true
console.log((0.1*10 + 0.2*10)/10);      // 0.3

또는 부동 소수점 수를 고정된 정밀도 숫자로 반올림할 수도 있다.

console.log((0.1 + 0.2).toFixed(2) == 0.3); // true
console.log((0.1 + 0.2).toFixed(2));        // 0.30

관련 수업

← 이전다음 →