표준 내장(빌트인) 객체인 Number
객체는 생성자 함수 객체다. 따라서 new
연산자와 함께 호출하여 Number
인스턴스를 생성할 수 있다.
Number
생성자 함수에 인수를 전달하지 않고 new
연산자와 함께 호출하면 [[NumberData]] 내부 슬롯에 0을 할당한 Number
래퍼 객체를 생성하며, 인수로 숫자를 전달하면서 new
연산자와 함께 호출하면 [[NumberData]] 내부 슬롯에 인수로 전달받은 숫자를 할당한 Number
래퍼 객체를 생성한다.
const numObj = new Number();
console.log(numObj); // Number {[[PrimitiveValue]]: 0}
const numObj = new Number(10);
console.log(numObj); // Number {[[PrimitiveValue]]: 10}
Number
생성자 함수의 인수로 숫자가 아닌 값을 전달하면 인수를 숫자로 강제 변환한 후, [[NumberData]] 내부 슬롯에 변환된 숫자를 할당한 Number
래퍼 객체를 생성한다. 인수를 숫자로 변환할 수 없다면 NaN
을 [[NumberData]] 내부 슬롯에 할당한 Number
래퍼 객체를 생성한다.let numObj = new Number('10');
console.log(numObj); // Number {[[PrimitiveValue]]: 10}
let numObj = new Number('Hello');
console.log(numObj); // Number {[[PrimitiveValue]]: NaN}
New
연산자를 사용하지 않고 Number
생성자 함수를 호출하면 Number
인스턴스가 아닌 숫자를 반환한다.// 문자열 타입 -> 숫자 타입
Number('0'); // 0
Number('-1'); // -1
Number('10.53'); // 10.53
// 불리언 타입 -> 숫자 타입
Number(true); // 1
Number(false); // 0
ES6에서 도입된 Number.EPSILON
은 1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이와 같다. Number.EPSILON
은 약 2.2204460492503130808472633361816 * 10^-16 이다.
아래와 같이 부동소수점 산술 연산은 정확한 결과를 기대하기 어렵다. 정수는 2진법으로 오차 없이 저장 가능하지만 부동소수점을 표현하기 위해 가장 널리 쓰이는 표준인 IEEE 754는 2진법으로 변환했을 때 무한소수가 되어 미세한 오차가 발생할 수밖에 없는 구조적 한계가 있다.
0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3; // false
Number.EPSILON
은 부동소수점으로 인해 발생하는 오차를 해결하기 위해 사용한다. 아래는 Number.EPSILON
을 사용하여 부동소수점을 비교하는 함수다.function isEqual(a, b) {
// a와 b를 뺀 값의 절대값이 Number.EPSILON보다 작으면 같은 수로 인정한다.
return Math.abs(a - b) < Number.EPSILON;
}
isEqual(0.1 + 0.2, 0.3); // true
Number.MAX_VALUE
는 자바스크립트에서 표현할 수 있는 가장 큰 양수 값(1.7976931348623157 * 10^308)이다. Number.MAX_VALUE
보다 큰 숫자는 Infinity
다.Number.MAX_VALUE; // 1.7976931348623157e+308
Infinity > Number.MAX_VALUE; // true
Number.MIN_VALUE
는 자바스크립트에서 표현할 수 있는 가장 작은 양수 값(5 * 10^-324)이다. Number.MIN_VALUE
보다 작은 숫자는 0이다.Number.MIN_VALUE; // 5e-324
Number.MIN_VALUE > 0; // true
Number.MAX_SAFE_INTEGER
는 자바스크립트에서 안전하게 표현할 수 있는 가장 큰 정수값(9007199254740991)이다.Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MIN_SAFE_INTEGER
는 자바스크립트에서 안전하게 표현할 수 있는 가장 작은 정수값(-9007199254740991)이다.Number.MIN_SAFE_INTEGER; // -9007199254740991
Number.POSITIVE_INFINITY
는 양의 무한대를 나타내는 숫자값 Infinity
와 같다.Number.POSITIVE_INFINITY; // Infinity
Number.NEGATIVE_INFINITY
는 음의 무한대를 나타내는 숫자값 -Infinity
와 같다.Number.NEGATIVE_INFINITY; // -Infinity
Number.NaN
은 숫자가 아님(Not a Number)을 나타내는 숫자값이다. Number.NaN
은 window.NaN
과 같다.Number.NaN; // NaN
Number.isFinite
정적 메서드는 인수로 전달된 숫자값이 정상적인 유한수. 즉 Infinity
또는 -Infinity
가 아닌지 검사하여 그 결과를 불리언 값으로 반환한다.기본 문법
Number.isFinite(value)
매개변수
value
: 유한수인지 판별할 값
// 인수가 정상적인 유한수이면 true를 반환한다.
Number.isFinite(0); // true
Number.isFinite(Number.MAX_VALUE); // true
Number.isFinite(Number.MIN_VALUE); // true
// 인수가 무한수이면 false를 반환한다.
Number.isFinite(Infinity); // false
Number.isFinite(Infinity); // false
NaN
이면 언제나 false
를 반환한다.Number.isFinite(NaN); // false
Number.isFinite
메서드는 내장(빌트인) 전역 함수 isFinite
와 차이가 있다. isFinite
는 전달 받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행하지만 Number.isFinite
는 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false
다.// Number.isFinite는 인수를 숫자로 암묵적 타입 변환하지 않는다.
Number.isFinite(null); // false
// isFinite는 인수를 숫자로 암묵적 타입 변환한다.
isFinite(null); // true
Number.isInteger
정적 메서드는 인수로 전달된 숫자값이 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사하기 전에 인수를 숫자로 암묵적 타입 변환하지 않는다.기본 문법
Number.isInteger(value)
매개변수
value
: 정수인지 확인하려는 값
// 인수가 정수이면 true를 반환한다.
Number.isInteger(0); // true
Number.isInteger(123); // true
Number.isInteger(-123); // true
// 0.5는 정수가 아니다.
Number.isInteger(0.5); // false
// '123'을 숫자로 암묵적 타입 변환하지 않는다.
Number.isInteger('123'); // false
// false를 숫자로 암묵적 타입 변환하지 않는다.
Number.isInteger(false); // false
// Infinity/-Infinity는 정수가 아니다.
Number.isInteger(Infinity); // false
Number.isInteger(-Infinity); // false
Number.isNaN
정적 메서드는 인수로 전달된 숫자값이 NaN
인지 검사하여 그 결과를 불리언 값으로 반환한다.기본 문법
Number.isNaN(value)
매개변수
value
:NaN
인지 판별할 값
// 인수가 NaN이면 true를 반환한다.
Number.isNaN(NaN); // true
Number.isNaN
메서드는 내장(빌트인) 전역 함수 isNaN
과 차이가 있다. 내장 전역 함수 isNaN
은 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행하지만 Number.isNaN
메서드는 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제가 false
다.// Number.isNaN은 인수를 숫자로 암묵적 타입 변환하지 않는다.
Number.isNaN(undefined); // false
// isNaN은 인수를 숫자로 암묵적 타입 변환한다. undefined는 NaN으로 암묵적 타입 변환된다.
isNaN(undefined); // true
Number.isSafeInteger
정적 메서드는 인수로 전달된 숫자값이 안전한 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 안전한 정수값은 -(2^53 - 1)과 2^53 - 1 사이의 정수값이다. 검사전에 인수를 숫자로 암묵적 타입 변환하지 않는다.기본 문법
Number.isSafeInteger(testValue)
매개변수
testValue
: 안전한 정수인지 확인할 값.
// 0은 안전한 정수다.
Number.isSafeInteger(0); // true
// 1000000000000000은 안전한 정수다.
Number.isSafeInteger(1000000000000000); // true
// 10000000000000001은 안전하지 않다.
Number.isSafeInteger(10000000000000001); // false
// 0.5는 정수가 아니다.
Number.isSafeInteger(0.5); // false
// '123'을 숫자로 암묵적 타입 변환하지 않는다.
Number.isSafeInteger('123'); // false
// false를 숫자로 암묵적 타입 변환하지 않는다.
Number.isSafeInteger(false); // false
// Infinity/-Infinity는 정수가 아니다.
Number.isSafeInteger(Infinity); // false
toExponential
메서드는 숫자를 지수 표기법으로 변환하여 문자열로 반환한다. 인수로 소수점 이하로 표현할 자릿수를 전달할 수 있다.기본 문법
numObj.toExponential([fractionDigits])
매개변수
fractionDigits
: 소수점 이하로 표현할 자릿수로, 기본값은 주어진 값을 나타내는데 필요한 자릿수다.
(77.1234).toExponential(); // "7.71234e+1"
(77.1234).toExponential(4); // "7.7123e+1"
(77.1234).toExponential(2); // "7.71e+1"
77.toExponential(); // SyntaxError: Invalid or unexpected token
toFixed
메서드는 숫자를 반올림하여 문자열로 변환한다. 반올림하는 소수점 이하 자릿수를 나타내는 0~20 사이의 정수값을 인수로 전달할 수 있다. 인수를 생략하면 기본값 0이 지정된다.기본 문법
numObj.toFixed([digits])
매개변수
digits
: 소수점 뒤에 나타날 자릿수. 0 이상 20 이하의 값을 사용할 수 있으며, 구현체에 따라 더 넓은 범위의 값을 지원할 수도 있다. 값을 지정하지 않으면 0을 사용한다.
// 소수점 이하 반올림. 인수를 생략하면 기본값 0이 지정된다.
(12345.6789).toFixed(); // '123456'
// 소수점 이하 1자릿수 유효. 나머지 반올림
(12345.6789).toFixed(1); // '12345.7'
// 소수점 이하 2자릿수 유효. 나머지 반올림
(12345.6789).toFixed(2); // '12345.68'
// 소수점 이하 3자릿수 유효. 나머지 반올림
(12345.6789).toFixed(3); // '12345.679'
toPrecision
메서드는 인수로 전달받은 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다. 인수로 전달받은 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다.
전체 자릿수를 나타내는 0~21 사이의 정수값을 인수로 전달할 수 있다. 인수를 생략하면 기본값 0이 지정된다.
기본 문법
numObj.toPrecision([precision])
매개변수
precision
: 선택적 파라미터. 유효 자릿수를 지정하는 정수
// 전체 자릿수 유효. 인수를 생략하면 기본값 0이 지정된다.
(12345.6789).toPrecision(); // '12345.6789'
// 전체 1자릿수 유효. 나머지 반올림
(12345.6789).toPrecision(1); // '1e+4'
// 전체 2자릿수 유효. 나머지 반올림
(12345.6789).toPrecision(2); // '1.2e+4'
// 전체 6자릿수 유효. 나머지 반올림
(12345.6789).toPrecision(6); // '12345.7'
toString
메서드는 숫자를 문자열로 변환하여 반환한다.
인수로 진법을 나타내는 2~36 사이의 정수값을 전달하면 10진수를 2~36 진수로 변환할 수 있다.
인수를 생략하면 기본값 10진법이 지정된다.
기본 문법
numObj.toString([radix])
매개변수
radix
: 10진수를 다른 진수로 변환하기 위한 2와 36 사이의 정수(진수를 나타내는 기수의 값)
let num = 101;
// 인수를 생략하면 10진수 문자열을 반환한다.
num.toString(); // '101'
// 인수로 2를 전달하면 10진수인 101을 2진수로 변환한 문자열을 반환한다.
num.toString(2); // '1010'
// 인수로 8을 전달하면 10진수인 101을 8진수로 변환한 문자열을 반환한다.
num.toString(8); // '12'