JavaScript Number 객체
JavaScript의 Number 객체는 숫자를 다루는 타입입니다. 변수 또는 객체의 프로퍼티 값이 숫자라면 Number 객체의 프로퍼티와 메서드를 사용할 수 있습니다. 이렇게 별도의 객체 생성없이 프로퍼티와 메서드를 사용할 수 있는 것은 Number 객체가 wrapper 객체이기 때문입니다.
* wrapper 객체는 원시 타입이 wrapper 객체의 프로퍼티나 메서드를 호출할 때, 일시적으로 연관된 wrapper 객체로 변환하여 prototype 객체를 공유합니다.
JavaScript에서 숫자의 표기는 IEEE 754 형식을 따르고 있고 32비트까지 표현이 가능합니다. IEEE 754 형식은 부동소수점을 표현하는 가장 널리 쓰이는 표준이며 +0, -0, Infinity, NaN 등의 기호를 표시하는 법과 이러한 수에 대한 연산을 정의하고 있습니다.
1. Number 생성자
Number 생성자를 이용하여 Number 객체 생성이 가능합니다. 생성시 함께 전달된 파라미터가 숫자로 변환될 수 없다면 NaN을 반환합니다.
1
2
3
4
5
6
7
|
let a = new Number(10);
let b = new Number('10');
let c = new Number('str');
console.log(a); // Number {10}
console.log(b); // Number {10}
console.log(c); // Number {NaN}
|
cs |
new 연산자를 이용하여 Number 객체를 생성하지 않고 내장 객체를 호출하면 Primitive Type의 숫자 리터럴을 반환합니다. 이러한 경우엔 형변환이 발생할 수도 있습니다.
1
2
3
4
5
|
let a = Number(10);
let b = Number('10');
console.log(a); // 10
console.log(b); // 10
|
cs |
숫자를 사용할 때는 일반적으로 다음과 같이 Primitie Type의 숫자를 사용합니다.
1
2
3
4
5
6
7
8
|
let a = 10;
let b = new Number(10);
console.log(typeof a); // number
console.log(typeof b); // object
console.log(a == b); // true
console.log(a === b); // false
|
cs |
2. Number 내장 객체의 Property
Number 내장 객체를 사용하면 다음의 static property를 사용할 수 있습니다.
2.1. Number.EPSILON
EPSILON 프로퍼티는 JavaScript에서 표현할 수 있는 가장 작은 수 입니다. JavaScript에서 부동소수점 산술 연산의 비교는 정확한 값을 기대하기 어렵습니다. 정수의 경우엔 2진법으로 변환시 오차없는 결과값을 확인할 수 있지만, 부동소수점은 2진법으로 변환시 무한소수가 되어 오차가 발생합니다. EPSILON 프로퍼티는 이와 같은 부동소수점 연산의 비교에 사용됩니다.
다음과 같이 두 수의 차가 EPSILON 보다 작으면 같은 수로 인정되여 true를 반환합니다.
1
2
3
4
5
6
7
|
function isEqual(a, b){
return Math.abs(a - b) < Number.EPSILON;
}
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 == 0.3); // false
console.log(isEqual(0.1 + 0.2, 0.3)); // true
|
cs |
2.2. Number.MAX_VALUE
MAX_VALUE 프로퍼티는 JavaScript에서 사용 가능한 가장 큰 수를 반환합니다. (참고로 MAX_VALUE 보다 큰 숫자는 Infinity로 표현합니다)
1
2
|
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
console.log(Infinity > Number.MAX_VALUE); // true
|
cs |
2.3. Number.MIN_VALUE
MIN_VALUE 프로퍼티는 JavaScript에서 사용 가능한 가장 작은 수를 반환합니다. 0에 가장 가까운 양수값 입니다.
1
2
|
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MIN_VALUE > 0); // true
|
cs |
2.4. Number.POSITIVE_INFINITY
POSITIVE_INFINITY 프로퍼티는 양의 무한대를 반환합니다.
1
2
|
console.log(Number.POSITIVE_INFINITY); // Infinity
console.log(Number.POSITIVE_INFINITY > 0); // true
|
cs |
2.5. Number.NEGATIVE_INFINITY
NEGATIVE_INFINITY 프로퍼티는 음의 무한대를 반환합니다.
1
2
|
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(Number.NEGATIVE_INFINITY < 0); // true
|
cs |
2.5. Number.NaN
NaN 프로퍼티는 숫자가 아님(Not a Number)을 나타내는 값입니다.
1
2
|
console.log(Number('str')); // NaN
console.log(typeof NaN); // number
|
cs |
3. Number 내장 객체의 Method
3.1. isFinite()
isFinite() 메서드는 파라미터로 전달된 값이 정상적인 유한수인지 확인하여 Boolean 값을 반환합니다.
* 전역 함수의 isFinite()는 파라미터의 형변환이 이루어지지만 Number 내장 객체의 isFinite()는 형변환이 이루어지지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// Number.isFinite(number: number)
console.log(Number.isFinite(Infinity)); // false
console.log(Number.isFinite(NaN)); // false
console.log(Number.isFinite('Harry')); // false
console.log(Number.isFinite('2020-01-01')); // false
console.log(Number.isFinite(0)); // true
console.log(Number.isFinite(-10)); // true
console.log(Number.isFinite(1.23)); // true
console.log(Number.isFinite(0x41)); // true
console.log(Number.isFinite('10')); // false
console.log(isFinite('10')); // true
console.log(Number.isFinite(null)); // false
console.log(isFinite(null)); // true
|
cs |
3.2. isInteger()
isInteger() 메서드는 파라미터로 받은 값이 정수인지 확인하여 Boolean 값을 반환합니다. isInteger() 메서드에서 전달받은 파라미터는 숫자로 형변환이 이루어지지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
|
// Number.isInteger(number: number)
console.log(Number.isInteger(10)); // true
console.log(Number.isInteger(-10)); // true
console.log(Number.isInteger('10')); // false
console.log(Number.isInteger(0)); // true
console.log(Number.isInteger(-0)); // true
console.log(Number.isInteger(false)); // false
console.log(Number.isInteger(Infinity)); // false
console.log(Number.isInteger(-Infinity)); // false
console.log(Number.isInteger(0/0)); // false
|
cs |
3.3. isNaN()
isNaN() 메서드는 파라미터로 받은 값이 NaN인지 확인하여 Boolean 값을 반환합니다. Number 객체의 isNaN() 메서드는 파라미터를 숫자로 형변환하지 않지만 전역 함수의 isNaN() 메서드는 파라미터를 숫자로 형변환한다는 차이가 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Number.isNaN(number: number)
console.log(Number.isNaN(NaN)); // true
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(undefined)); // false
console.log(isNaN(undefined)); // true
console.log(Number.isNaN(true)); // false
console.log(isNaN(true)); // false
console.log(Number.isNaN(null)); // false
console.log(isNaN(null)); // false
console.log(Number.isNaN(10)); // false
console.log(isNaN(10)); // false
console.log(Number.isNaN('10')); // false
console.log(isNaN('10')); // false
console.log(Number.isNaN('str')); // false
console.log(isNaN('str')); // true
console.log(Number.isNaN('')); // false
console.log(isNaN('')); // false
console.log(Number.isNaN({})); // false
console.log(isNaN({})); // true
|
cs |
3.4. isSafeInteger()
isSafeInteger() 메서드는 파라미터로 받은 값이 안전한 범위 내의 정수인지 확인하여 Boolean 값을 반환합니다. 안전한 정수값의 범위는 -2^53-1 ~ 2^53-1 이며 파라미터를 숫자로 형변환하지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// Number.isSafeInteger(number: number)
console.log(Number.isSafeInteger(10)); //true
console.log(Number.isSafeInteger(-10)); //true
console.log(Number.isSafeInteger(0)); //true
console.log(Number.isSafeInteger(-0)); //true
console.log(Number.isSafeInteger(0.1)); //false
console.log(Number.isSafeInteger('10')); //false
console.log(Number.isSafeInteger(10000000000000001)); // false
console.log(Number.isSafeInteger(true)); //false
console.log(Number.isSafeInteger(false)); //false
console.log(Number.isSafeInteger(Infinity)); //false
console.log(Number.isSafeInteger(-Infinity)); //false
console.log(Number.isSafeInteger(0/0)); //false
|
cs |
3.5. parseInt()
parseInt() 메서드는 파라미터로 받은 문자열을 숫자로 변환하여 반환합니다. 두번째 파라미터를 넘겨주면 해당 파라미터의 진법으로 변환하여 반환합니다. 또한 숫자가 포함된 문자열의 경우에도 변환이 이루어지는데, 문자열의 시작이 숫자인 경우에만 해당하며 숫자가 끝나는 위치까지만 변환이 이루어집니다.
Number 내장 객체 또한 Number.parseInt() 메서드처럼 파라미터를 숫자로 변환하여 반환해주는데 전달받은 파라미터의 값이 숫자로만 이루어져야 변환이 된다는 차이가 있습니다. 숫자가 아닌 경우엔 NaN을 반환합니다.
Number.parseInt() 메서드와 내장 함수 parseInt()의 기능은 동일하지만 파라미터의 타입 체크에서 차이점이 있는데, Number.parseInt() 메서드는 타입을 string으로 강제하기 때문에 경우에 따라 Type Error가 발생할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
// Number.parseInt(string: string, radix?: number)
console.log(Number.parseInt('10')); // 10
console.log(Number.parseInt(10)); // 10
console.log(Number('10')); // 10
console.log(Number(10)); // 10
console.log(parseInt('10')); // 10
console.log(parseInt(10)); // 10
console.log(Number.parseInt('0.1')); // 0
console.log(Number.parseInt('0.5')); // 0
console.log(Number.parseInt('abc123')); // NaN
console.log(Number.parseInt('')); // NaN
console.log(Number.parseInt('123abc')); // 123
console.log(Number.parseInt('1a2b3c')); // 1
console.log(Number('123abc')); // NaN
console.log(Number('1a2b3c')); // NaN
console.log(parseInt('123abc')); // 123
console.log(parseInt('1a2b3c')); // 1
// 진법으로 변환하여 반환
console.log(Number.parseInt('0xFF', 8)); // 0
console.log(Number.parseInt('ff', 16)); // 255
|
cs |
3.6. parseFloat()
parseFloat() 메서드는 파라미터로 받은 문자열을 실수형의 숫자로 변환하여 반환합니다. parseInt() 메서드와 비교하여 진법 변환을 제외하고는 동일하게 동작합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// Number.parseFloat(string: string)
console.log(Number.parseFloat('10')); // 10
console.log(Number.parseFloat(10)); // 10
console.log(Number.parseFloat('0.1')); // 0.1
console.log(Number.parseFloat(0.1)); // 0.1
console.log(parseFloat('0.1')); // 0.1
console.log(parseFloat(0.1)); // 0.1
console.log(Number.parseFloat('abc1.23')); // NaN
console.log(Number.parseFloat('')); // NaN
console.log(Number.parseFloat('1.23abc')); // 1.23
console.log(Number.parseFloat('0.1a0.2b0.3c')); // 0.1
console.log(parseFloat('1.23abc')); // 1.23
console.log(parseFloat('0.1a0.2b0.3c')); // 0.1
|
cs |
3.7. toFixed()
toFixed() 메서드는 파라미터로 받은 값의 소숫점자리를 반올림하여 문자열로 반환합니다.
1
2
3
4
5
6
7
|
// Number.toFixed(fractionDigits?: number)
let num = 123.456;
console.log(num.toFixed()); // '123', 소숫점 이하 반올림
console.log(num.toFixed(1)); // '123.5', 소숫점 이하 1자리수만 유효하고 나머지는 반올림
console.log(num.toFixed(2)); // '123.46', 소숫점 이하 2자리수만 유효하고 나머지는 반올림
|
cs |
3.8. toString()
toString() 메서드는 숫자를 문자열로 변환하여 반환합니다. 파라미터가 있는 경우엔 해당 파라미터의 진법으로 변환하여 반환합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// Number.toString(radix?: number)
let num1 = 10;
let num2 = 16;
console.log(num1.toString()); // '10'
console.log((10).toString()); // '10'
console.log((0.1).toString()); // '0.1'
// 진법으로 변환하여 반환
console.log(num2.toString(2)); // '10000'
console.log(num2.toString(8)); // '20'
console.log(num2.toString(16)); // '10'
|
cs |
3.9. valueOf()
valueOf() 메서드는 Primitive Type 값을 반환합니다.
1
2
3
4
5
6
7
8
9
|
// Number.valueOf()
let num1 = 10;
let num2 = new Number(10);
console.log(typeof num1); // number
console.log(typeof num2); // object
console.log(num1.valueOf()); // 10
console.log(num2.valueOf()); // 10
|
cs |
이상으로 JavaScript의 Number 객체에 대해 알아봤습니다.
※ Reference
- ko.wikipedia.org, IEEE 754, https://ko.wikipedia.org/wiki/IEEE_754
- medium.com/@pks2974, Javascript 와 Number 숫자, https://medium.com/@pks2974/javascript-%EC%99%80-number-%EC%88%AB%EC%9E%90-1e6cbfbbe312
- poiemaweb.com, Number 레퍼 객체, https://poiemaweb.com/js-number
- goddaehee.tistory.com, [JavaScript (9)] Javascript Number 객체, Number 메소드, https://goddaehee.tistory.com/232
- megaton111.cafe24.com, 문자열을 숫자로 형변환하기! Number() 와 parseInt()의 차이, http://megaton111.cafe24.com/2018/05/07/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EC%88%AB%EC%9E%90%EB%A1%9C-%ED%98%95%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0-nuber-%EC%99%80-parseint%EC%9D%98-%EC%B0%A8%EC%9D%B4/