28장 Number
- Number 표준 빌트인 객체가 제공하는 프로퍼티와 메서드를 알아본다
1. Number 생성자 함수
- Number 객체는 생성자 함수 객체이므로, new 연산자와 호출하여 Number 인스턴스 생성이 가능
const numObj = new Number();
console.log(numObj);
numObj = new Number(10);
console.log(numObj);
numObj = new Number('10');
console.log(numObj);
numObj = new Number('Hello');
console.log(numObj);
Number('0');
Number('-1');
Number('10.53');
Number(true);
Number(false);
2. Number 프로퍼티
2.1 Number.EPSILON
- ES6 도입
- 1과 1보다 큰 숫자 중에서 가장 작은 부동소수점 숫자와의 차이 => 2.2204460492503130808472633361816 * 10^-16
- 필요한 이유?
부동소수점 산술 연산은 부정확하다
- 부동소수점 표기 표준 IEEE 754 : https://ko.wikipedia.org/wiki/IEEE_754
- 컴퓨터는 소수를 2진법으로 저장하기 때문에, 10진수 소수를 정확히 표현못하고 항상 근사값을 사용. 그래서 반올림 오차가 발생.
- ...그리고 다른 언어와 달리 js는 정수에서도 부동소수점 연산을 써서 정수 연산에서도 오차가 있다.
0.1 + 0.2;
0.1 + 0.2 === 0.3;
Number.EPSILON 이하의 오차는 같은 수로 인정
function isEqual(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
isEqual(0.1 + 0,2, 0.3);
2.2 Number.MAX_VALUE
- js에서 표현 가능한 가장 큰 양수값
- Infinity 보다는 작다
2.3 Number.MIN_VALUE
- js에서 표현 가능한 가장 작은 양수값
- 0보다는 크다
- EPSILON 보다 훨씬 작다. EPSILON은 한 자리수 1과 1보다 큰 숫자간의 차이이기 때문에, MIN_VALUE보다 큰 지수를 가진다.
2.4 Number.MAX_SAFE_INTEGER
- js에서 안전하게 표현할 수 있는 가장 큰 "정수"값
- js는 정수 연산에서도 부동소수점 연산을 사용하기 때문에, 이 정수보다 큰 수는 오차가 발생한다.
2.5 Number.MIN_SAFE_INTEGER
- js에서 안전하게 표현할 수 있는 가장 작은 "정수"값
2.6 Number.POSITIVE_INFINITY
2.7 Number.NEGATIVE_INFINITY
2.8 Number.NaN
- Not-a-Number
- = window.NaN
3. Number 메서드
3.1 Number.isFinite
- Infinity 또는 -Inifity인지 검사
- 유한수이면 true 리턴
3.2 Number.isInteger
Number.isInteger(0)
Number.isInteger(123)
Number.isInteger(-123)
Number.isInteger(0.5)
Number.isInteger('123')
Number.isInteger(false)
Number.isInteger(Infinity)
Number.isInteger(-Infinity)
3.3 Number.isNaN
Number.isNaN(NaN);
- 단, 전역 함수 isNaN와는 동작이 다르다. Number.isNaN은 인자를 숫자로 암묵적 타입 변환하지 않는다.
Number.isNaN(undefined);
isNaN(undefined);
3.4 Number.isSafeInteger
- 안전한 정수인지 검사
- 인자를 숫자로 암묵적 타입 변환하지 않는다.
Number.isSafeInteger(10000000000000001);
Number.isSafeInteger(0.5);
Number.isSafeInteger('123');
3.5 Number.prototype.toExponential
- 지수 표기법으로 변환
- 인자로 소수점 이하로 표현할 자릿수 전달 가능
(77.1234).toExponential();
(77.1234).toExponential(4);
(77.1234).toExponential(2);
77.toExponential();
77.1234.toExponential();
77 .toExponential();
(77).toExponential();
3.6 Number.prototype.toFixed
(12345.6789).toFixed();
(12345.6789).toFixed(1);
(12345.6789).toFixed(2);
(12345.6789).toFixed(3);
3.7 Number.prototype.toPrecision
- 반올림 + 문자열로 변환
- 인자로 받은 자릿수(0~21)를 넘어가면 지수 표기법으로 변환
(12345.6789).toPrecision();
(12345.6789).toPrecision(1);
(12345.6789).toPrecision(2);
(12345.6789).toPrecision(6);
3.8 Number.prototype.toString
- 숫자를 문자열로 변환
- 인자로 진법(2~36) 전달 가능
(10).toString();
(16).toString(2);
(16).toString(8);
(16).toString(16);