5.17 Javascript Number

기본자료형 number를 위한 레퍼(wrapper) 객체

Number 객체는 기본자료형 number를 다룰 때 유용한 프로퍼티와 메서드를 제공하는 레퍼(wrapper) 객체이다. 변수 또는 객체의 프로퍼티가 숫자를 값으로 가지고 있다면 Number 객체의 별도 생성없이 Number 객체의 프로퍼티와 메서드를 사용할 수 있다.

기본자료형이 wrapper 객체의 메서드를 사용할 수 있는 이유는 기본자료형으로 프로퍼티나 메소드를 호출할 때 기본자료형과 연관된 wrapper 객체로 일시적으로 변환되어 프로토타입 객체를 공유하게 되기 때문이다.

var num = 1.5;
console.log(num.toFixed()); // 2

위에서 기본자료형을 담고 있는 변수 num이 Number.prototype.toFixed() 메서드를 호출할 수 있는 것은 변수 num의 값이 일시적으로 wrapper객체로 변환되었기 때문이다.

1. Number Constructor

Number 객체는 Number() 생성자 함수를 통해 생성할 수 있다.

new Number(value);

만일 인자가 숫자로 변환될 수 없다면 NaN을 반환한다.

var x = new Number(123);
var y = new Number('123');
var z = new Number('str');

console.log(x);
console.log(y);
console.log(z);

Number() 생성자 함수를 new 연산자를 붙이지 않아 생성자로 사용하지 않으면 Number 객체를 반환하지 않고 형 변환 결과값을 반환한다.

new 연산자를 사용하지 않고 Number() 생성자 함수를 호출하면 Number 객체가 아닌 기본자료형 숫자를 반환한다. 이때 형 변환이 발생할 수 있다.

var x = Number('123');

console.log(typeof x, x); // number 123

일반적으로 숫자를 사용할 때는 기본자료형의 number를 사용한다.

var x = 123;
var y = new Number(123);

console.log(x == y);  // true
console.log(x === y); // false

console.log(typeof x); // number
console.log(typeof y); // object

2. Number Property

정적(static) 프로퍼티로 Number 객체를 생성할 필요없이 Number.propertyName의 형태로 사용한다.

2.1 Number.EPSILON

Number.EPSILON은 JavaScript에서 표현할 수 있는 가장 작은 수이다. 이는 임의의 수와 그 수보다 큰 수 중 가장 작은 수의 차이와 같다. Number.EPSILON은 약 2.2204460492503130808472633361816E-16 또는 2-52이다.

부동소수점은 산술 연산 비교는 정확한 값을 기대하기 어렵다. 따라서 부동소수점의 비교는 Number.EPSILON을 사용하여 비교 기능을 갖는 함수를 작성하여야 한다.

console.log(0.1 + 0.2);        // 0.30000000000000004
console.log(0.1 + 0.2 == 0.3); // false!!!

function isEqual(a, b){
  return Math.abs(a - b) < Number.EPSILON;
}

console.log(isEqual(0.1 + 0.2, 0.3));

2.2 Number.MAX_VALUE

자바스크립트에서 사용 가능한 가장 큰 숫자(1.7976931348623157e+308)를 반환한다. MAX_VALUE보다 큰 숫자는 Infinity이다.

Number.MAX_VALUE; // 1.7976931348623157e+308

var num = 10;
num.MAX_VALUE;    // undefined

console.log(Infinity > Number.MAX_VALUE); // true

2.3 Number.MIN_VALUE

자바스크립트에서 사용 가능한 가장 작은 숫자(5e-324)를 반환한다. MIN_VALUE는 0에 가장 가까운 양수 값이다. MIN_VALUE보다 작은 숫자는 0으로 변환된다.

Number.MIN_VALUE; // 5e-324

var num = 10;
num.MIN_VALUE;    // undefined

console.log(Number.MIN_VALUE > 0); // true

2.4 Number.POSITIVE_INFINITY

양의 무한대 Infinity를 반환한다.

Number.POSITIVE_INFINITY // Infinity

var num = 10;
num.POSITIVE_INFINITY;   // undefined

2.5 Number.NEGATIVE_INFINITY

음의 무한대 -Infinity를 반환한다.

Number.NEGATIVE_INFINITY // -Infinity

var num = 10;
num.NEGATIVE_INFINITY;   // undefined

2.6 Number.NaN

숫자가 아님(Not-a-Number)을 나타내는 숫자값이다. Number.NaN 속성은 NaN 속성과 같다.

console.log(Number('xyz')); // NaN
console.log(1 * 'string');  // NaN
console.log(typeof NaN);    // number

3. Number Method

3.1 Number.isFinite()

매개변수를 통해 전달된 값이 유한수인지, 정상적인 수인지를 검사하여 그 결과를 Boolean으로 반환한다.

Number.isFinite(testValue)
// testValue: 검사 대상 값

Number.isFinite()는 전역 함수 isFinite()와 차이가 있다. 전역 함수 isFinite()는 매개변수를 Number로 변환하여 검사를 수행하지만 Number.isFinite()는 매개변수를 변환하지 않는다. 따라서 Number가 아닌 매개변수가 주어졌을 때 반환값은 언제나 false가 된다.

Number.isFinite(Infinity)  // false
Number.isFinite(NaN)       // false
Number.isFinite("Hello")   // false
Number.isFinite("2005/12/12")   // false

Number.isFinite(0)         // true
Number.isFinite(2e64)      // true
Number.isFinite(null)      // false. isFinite(null) -> true

3.2 Number.isInteger()

매개변수를 통해 전달된 값이 정수(Integer)인지 검사하여 그 결과를 Boolean으로 반환한다. 검사전에 매개변수를 Number로 변환하지 않는다.

Number.isInteger(testValue)
// testValue: 검사 대상 값
Number.isInteger(123)   //true
Number.isInteger(-123)  //true
Number.isInteger(5-2)   //true
Number.isInteger(0)     //true
Number.isInteger(0.5)   //false
Number.isInteger('123') //false
Number.isInteger(false) //false
Number.isInteger(Infinity)  //false
Number.isInteger(-Infinity) //false
Number.isInteger(0 / 0) //false

3.3 Number.isNaN()

매개변수를 통해 전달된 값이 NaN인지를 검사하여 그 결과를 Boolean으로 반환한다.

Number.isNaN(testValue)
// testValue: 검사 대상 값

Number.isNaN()는 전역 함수 isNaN()와 차이가 있다. 전역 함수 isNaN()는 매개변수를 Number로 변환하여 검사를 수행하지만 Number.isNaN()는 매개변수를 변환하지 않는다. 따라서 Number가 아닌 매개변수가 주어졌을 때 반환값은 언제나 false가 된다. 이는 자바스크립트에서 NaN은 Number type이기 때문에 Number type이 아닌 매개변수가 주어졌을 때 반환값은 false가 되기 때문이다.

Number.isNaN(NaN)       // true
Number.isNaN(undefined) // false. undefined->NaN. isNaN(undefined) -> true.
Number.isNaN({})        // false. {}->NaN.        isNaN({}) -> true.
Number.isNaN("blabla")  // false. "blabla"->NaN.  isNaN("blabla") -> true.

Number.isNaN(true)      // false
Number.isNaN(null)      // false
Number.isNaN(37)        // false
Number.isNaN("37");     // false
Number.isNaN("37.37");  // false
Number.isNaN("");       // false
Number.isNaN(" ");      // false
Number.isNaN(new Date())             // false
Number.isNaN(new Date().toString())  // false. String->NaN. isNaN(String) -> true.

3.4 Number.isSafeInteger()

매개변수를 통해 전달된 값이 안전한(safe) 정수값인지 검사하여 그 결과를 Boolean으로 반환한다. 안전한 정수값은 (253 - 1)와 -(253 - 1) 사이의 정수값이다. 검사전에 매개변수를 Number로 변환하지 않는다.

Number.isSafeInteger(testValue)
// testValue: 검사 대상 값
Number.isSafeInteger(123)   //true
Number.isSafeInteger(-123)  //true
Number.isSafeInteger(5-2)   //true
Number.isSafeInteger(0)     //true
Number.isSafeInteger(1000000000000000)  // true
Number.isSafeInteger(10000000000000001) // false
Number.isSafeInteger(0.5)   //false
Number.isSafeInteger('123') //false
Number.isSafeInteger(false) //false
Number.isSafeInteger(Infinity)  //false
Number.isSafeInteger(-Infinity) //false
Number.isSafeInteger(0 / 0) //false

3.5 Number.prototype.toExponential()

대상을 지수 표기법으로 변환하여 문자열로 반환한다. 지수 표기법이란 매우 큰 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승이 곱하는 형식으로 수를 나타내는 방식이다.

1234 = 1.234e+3
numObj.toExponential([fractionDigits])
// fractionDigits: 0~20 사이의 정수값으로 소숫점 이하의 자릿수를 나타낸다. 옵션으로 생략 가능하다.  
var numObj = 77.1234;

console.log(numObj.toExponential());  // logs 7.71234e+1
console.log(numObj.toExponential(4)); // logs 7.7123e+1
console.log(numObj.toExponential(2)); // logs 7.71e+1
console.log(77.1234.toExponential()); // logs 7.71234e+1
console.log(77 .toExponential());     // logs 7.7e+1

3.6 Number.prototype.toFixed()

매개변수로 지정된 소숫점자리를 반올림하여 문자열로 반환한다.

numObj.toFixed([digits])
// digits: 0~20 사이의 정수값으로 소숫점 이하 자릿수를 나타낸다. 기본값은 0이며 옵션으로 생략 가능하다.
var numObj = 12345.6789;

numObj.toFixed();       // '12346': 소수점 이하를 반올림
numObj.toFixed(1);      // '12345.7'
numObj.toFixed(6);      // '12345.678900'
(1.23e+20).toFixed(2);  // '123000000000000000000.00'
(1.23e-10).toFixed(2);  // '0.00': 0.00000001의 소수점 2자리 이후를 반올림
2.34.toFixed(1);        // '2.3'
2.35.toFixed(1);        // '2.4'. Note that it rounds up in this case.
-2.34.toFixed(1);       // -2.3: 가로 안에 음수를 넣어두지 않으면 문자열을 반환하지 않는다
(-2.34).toFixed(1);     // '-2.3'

3.7 Number.prototype.toPrecision()

매개변수로 지정된 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다. 지정된 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다.

numObj.toPrecision([precision])
// precision: 1~21 사이의 정수값으로 전체 자릿수를 나타낸다. 옵션으로 생략 가능하다.
var numObj = 5.123456;

numObj.toPrecision()    // '5.123456'
numObj.toPrecision(5)   // '5.1235'
numObj.toPrecision(2)   // '5.1'
numObj.toPrecision(1)   // '5'

(1234.5).toPrecision(2) // `1.2e+3`

3.8 Number.prototype.toString()

숫자를 문자열로 변환하여 반환한다.

numObj.toString([radix])
// radix: 2~36 사이의 정수값으로 진법을 나타낸다. 옵션으로 생략 가능하다.
var count = 10;
console.log(count.toString());   // '10'
console.log((17).toString());    // '17'
console.log((17.2).toString());  // '17.2'

var x = 16;
console.log(x.toString(2));       // '10000'
console.log(x.toString(8));       // '20'
console.log(x.toString(16));      // '10'

console.log((254).toString(16));  // 'fe'
console.log((-10).toString(2));   // '-1010'
console.log((-0xff).toString(2)); // '-11111111'

3.9 Number.prototype.valueOf()

Number 객체의 기본자료형 값(primitive value)을 반환한다.

numObj.valueOf()
var numObj = new Number(10);
console.log(typeof numObj); // object

var num = numObj.valueOf();
console.log(num);           // 10
console.log(typeof num);    // number

Reference

Back to top
Close