...
자바스크립트 Number 메소드
래퍼 객체(wrapper object)
var str = "문자열"; // 리터럴 문자열 생성
var len = str.length; // 문자열 프로퍼티인 length 사용
위의 예제에서 생성한 문자열 리터럴 str은 객체가 아닌데도 length 프로퍼티를 사용할 수 있다.
프로그램이 문자열 리터럴 str의 프로퍼티를 참조하려고 하면, 자바스크립트는 new String(str)을 호출한 것처럼 문자열 리터럴을 객체로 자동 변환해주기 때문이다.
이렇게 생성된 임시 객체는 String 객체의 메소드를 상속받아 프로퍼티를 참조하는 데 사용된다.
이후 프로퍼티의 참조가 끝나면 사용된 임시 객체는 자동으로 삭제된다.
이렇게 숫자, 문자열, 불리언 등 원시 타입의 프로퍼티에 접근하려고 할 때 생성되는 임시 객체를 래퍼 객체(wrapper object)라고 한다.
var num = 1.5;
console.log(num.toFixed()); // 2
위에서 원시 타입을 담고 있는 변수 num이 Number.prototype.toFixed() 메소드를 호출할 수 있는 것은 변수 num의 값이 일시적으로 wrapper객체로 변환되었기 때문이다.
Number Constructor
Number 객체는 Number() 생성자 함수를 통해 생성할 수 있다.
만일 인자가 숫자로 변환될 수 없다면 NaN을 반환한다.
var x = new Number(123);
var y = new Number('123');
var z = new Number('str');
console.log(x); // 123
console.log(y); // 123
console.log(z); // NaN
일반적으로 숫자를 사용할 때는 원시 타입 숫자를 사용한다.
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
new 연산자를 사용하여 객체를 생성할 때에는 매우 많은 추가 연산을 해야만 합니다.
따라서 가능한 숫자 리터럴을 사용하여 수를 표현하고, Number 객체는 래퍼 객체로만 활용하는 것이 좋습니다.
Number.EPSILON
Number.EPSILON은 JavaScript에서 표현할 수 있는 가장 작은 수이다.
이는 임의의 수와 그 수보다 큰 수 중 가장 작은 수와의 차이와 같다.
Number.EPSILON은 약 2.2204460492503130808472633361816E-16 또는 2-52이다.
부동소수점 산술 연산 비교는 정확한 값을 기대하기 어렵다.
정수는 2진법으로 오차없이 저장이 가능하지만 부동소수점을 표현하는 가장 널리 쓰이는 표준인 IEEE 754은 2진법으로 변환시 무한소수가 되어 미세한 오차가 발생할 수밖에 없는 구조적 한계를 갖는다.
따라서 부동소수점의 비교는 Number.EPSILON을 사용하여 비교 기능을 갖는 함수를 작성하여야 한다.
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 == 0.3); // false!!!
function isEqual(a, b){
// Math.abs는 절댓값을 반환한다.
// 즉 a와 b의 차이가 JavaScript에서 표현할 수 있는 가장 작은 수인 Number.EPSILON보다 작으면 같은 수로 인정할 수 있다.
return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1 + 0.2, 0.3));
Number.MAX_VALUE
자바스크립트에서 사용 가능한 가장 큰 숫자(1.7976931348623157e+308)를 반환한다. MAX_VALUE보다 큰 숫자는 Infinity이다.
Number.MIN_VALUE
자바스크립트에서 사용 가능한 가장 작은 숫자(5e-324)를 반환한다. MIN_VALUE는 0에 가장 가까운 양수 값이다. MIN_VALUE보다 작은 숫자는 0으로 변환된다.
Number.POSITIVE_INFINITY
양의 무한대 Infinity를 반환한다.
Number.NEGATIVE_INFINITY
음의 무한대 -Infinity를 반환한다.
Number.NaN
숫자가 아님(Not-a-Number)을 나타내는 숫자값이다.
Number.NaN 프로퍼티는 window.NaN 프로퍼티와 같다.
console.log(Number('xyz')); // NaN
console.log(1 * 'string'); // NaN
console.log(typeof NaN); // number
null, undefined, NaN, Infinity에 대한 비교
자바스크립트에서는 약간은 비슷한 것 같으면서도 전혀 다른 4가지 값을 제공하고 있다.
- null은 object 타입이며, 아직 '값'이 정해지지 않은 것을 의미하는 값이다.
- undefined는 null과는 달리 하나의 타입이며, '타입'이 정해지지 않은 것을 의미하는 값이기도 하다.
- NaN은 number 타입이며, '숫자가 아님'을 의미하는 숫자이다.
- Infinity는 number 타입이며, '무한대'를 의미하는 숫자이다.
자바스크립트는 타입 검사가 매우 유연한 언어이다.
따라서 위의 값들 또한 문맥에 따라 다음과 같이 자동으로 타입 변환이 이루어진다.
값 | Boolean 문맥 | Number 문맥 | String 문맥 |
null | false | 0 | "null" |
undefined | false | NaN | "undefined" |
NaN | false | NaN | "NaN" |
Infinity | true | Infinity | "Infinity" |
Number Method
Number.isFinite(number) : boolean
매개변수에 전달된 값이 정상적인 유한수인지를 검사하여 그 결과를 Boolean으로 반환한다.
Number.isFinite()는 전역 함수 isFinite()와 차이가 있다.
전역 함수 isFinite()는 인수를 숫자로 변환하여 검사를 수행하지만
Number.isFinite()는 인수를 변환하지 않는다.
따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false가 된다.
Number.isFinite(Infinity) // false
Number.isFinite(NaN) // false
Number.isFinite('Hello') // false
Number.isFinite(0) // true
Number.isFinite(2e64) // true
Number.isFinite(null) // false. isFinite(null) => true
Number.isInteger(number) : boolean
매개변수에 전달된 값이 정수(Integer)인지 검사하여 그 결과를 Boolean으로 반환한다.
검사전에 인수를 숫자로 변환하지 않는다.
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
Number.isNaN(number) : boolean
매개변수에 전달된 값이 NaN인지를 검사하여 그 결과를 Boolean으로 반환한다.
Number.isNaN()는 전역 함수 isNaN()와 차이가 있다.
전역 함수 isNaN()는 인수를 숫자로 변환하여 검사를 수행하지만
Number.isNaN()는 인수를 변환하지 않는다.
따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 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.
Number.isSafeInteger(number) : boolean
매개변수에 전달된 값이 안전한(safe) 정수값인지 검사하여 그 결과를 Boolean으로 반환한다.
안전한 정수값은 -(253 - 1)와 253 - 1 사이의 정수값이다.
검사전에 인수를 숫자로 변환하지 않는다.
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(Infinity) //false
Number.isSafeInteger(-Infinity) //false
Number.isSafeInteger(0 / 0) //false
Number.prototype.toExponential(number) : string
대상을 지수 표기법으로 변환하여 문자열로 반환한다.
지수 표기법이란 매우 큰 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승이 곱하는 형식으로 수를 나타내는 방식이다.
var numObj = 77.1234;
numObj.toExponential(); // logs 7.71234e+1
numObj.toExponential(4); // logs 7.7123e+1
numObj.toExponential(2); // logs 7.71e+1
77.1234.toExponential(); // logs 7.71234e+1
77.toExponential()) // SyntaxError: Invalid or unexpected token
77 .toExponential(); // logs 7.7e+1
정수 리터럴과 함께 메소드를 사용할 경우
77.toString(); // SyntaxError: Invalid or unexpected token
1.23.toString (); // '1.23'
(77).toString(); // '77'
77 .toString(); // '77'
Number.prototype.toFixed(number) : string
매개변수로 지정된 소숫점자리를 반올림하여 문자열로 반환한
var numObj = 12345.6789;
// 소숫점 이하 반올림
numObj.toFixed(); // '12346'
// 소숫점 이하 1자리수 유효, 나머지 반올림
numObj.toFixed(1); // '12345.7'
// 소숫점 이하 2자리수 유효, 나머지 반올림
numObj.toFixed(2); // '12345.68'
Number.prototype.toPrecision(number) : string
매개변수로 지정된 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다.
지정된 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다.
var n = 123.112
n.toPrecision(3) // "123"
n.toPrecision(4) // "123.1"
n.toPrecision(5) // "123.11"
Number.prototype.toString(number) : string
숫자를 문자열로 변환하여 반환한다.
var count = 10;
count.toString(); // '10'
(17).toString(); // '17'
17 .toString(); // '17'
(17.2).toString(); // '17.2'
var x = 16;
x.toString(2); // '10000'
x.toString(8); // '20'
x.toString(16); // '10'
(254).toString(16); // 'fe'
(-10).toString(2); // '-1010'
(-0xff).toString(2); // '-11111111'
+ 진법 표현
자바스크립트에서는 기본적으로 10진법을 사용하여 수를 표현한다.
하지만 0x 접두사를 사용하여 16진법으로 수를 표현할 수도 있다.
var x = 0xAB; // 16진법으로 표현된 10진수 171
var y = 29; // 10진법으로 표현된 10진수 29
x + y; // 두 수 모두 10진법으로 자동으로 변환되어 계산됨. -> 200
위의 예제처럼 자바스크립트에서는 산술 연산 시 모든 수가 10진수로 자동 변환되어 계산된다.
또한, 숫자에 toString() 메소드를 사용하여 해당 숫자를 여러 진법의 형태로 변환할 수 있다.
var num = 256;
num.toString(2); // 2진법으로 변환 : 100000000
num.toString(8); // 8진법으로 변환 : 400
num.toString(10); // 10진법으로 변환 : 256
num.toString(16); // 16진법으로 변환 : 100
// 2진수로 변환한 결괏값을 문자열로 반환함.
num.toString(2); // 100000000
// 문자열을 숫자로 나눴기 때문에 자동으로 10진수로 변환되어 산술 연산된 결괏값
(num.toString(2) / 2); // 50000000
Number.prototype.valueOf() : number
Number 객체의 원시 타입 값(primitive value)을 반환한다.
var numObj = new Number(10);
typeof numObj; // object
var num = numObj.valueOf();
num; // 10
typeof num; // number
메소드 | 설명 |
Number.parseFloat() | 문자열을 파싱하여, 문자열에 포함된 숫자 부분을 실수 형태로 반환함. |
Number.parseInt() | 문자열을 파싱하여, 문자열에 포함된 숫자 부분을 정수 형태로 반환함. |
Number.isNaN() | 전달된 값이 NaN인지 아닌지를 검사함. |
Number.isFinite() | 전달된 값이 유한한 수인지 아닌지를 검사함. |
Number.isInteger() | 전달된 값이 정수인지 아닌지를 검사함. |
Number.isSafeInteger() | 전달된 값이 안전한 정수(safe integer)인지 아닌지를 검사함. |
프로토타입 메소드 | 설명 |
toExponential() | Number 인스턴스를 지수 표기법으로 변환한 후, 그 값을 문자열로 반환함. |
toFixed() | Number 인스턴스의 소수 부분 자릿수를 전달받은 값으로 고정한 후, 그 값을 문자열로 반환함. |
toPrecision() | Number 인스턴스의 가수와 소수 부분의 합친 자릿수를 전달받은 값으로 고정한 후, 그 값을 문자열로 반환함. |
toString() | Number 인스턴스의 값을 문자열로 반환함. |
valueOf() | Number 인스턴스가 가지고 있는 값을 반환함. |
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.