|
| 1 | +# Number |
| 2 | + |
| 3 | +표준 빌트인 객체인 Number는 원시 타입인 숫자를 다룰 때 유용한 프로퍼티와 메서드를 제공한다. |
| 4 | + |
| 5 | +## 28.1 Number 생성자 함수 |
| 6 | + |
| 7 | +Number 객체는 생성자 함수 객체다. 따라서 new 연산자와 함께 호출하여 인스턴스를 생성할 수 있다. |
| 8 | + |
| 9 | +생성자 함수에 인수를 전달하지 않고 new 연산자와 함께 호출하면, [[PrimitiveValue]] 내부 슬롯에 0을 할당한 Number 래퍼 객체를 생성한다. |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | +생성자 함수에 인수로 숫자를 전달하면서 new 연산자와 함께 호출하면, [[PrimitiveValue]] 내부 슬롯에 전달받은 숫자를 할당한 Number 래퍼 객체를 생성한다. |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +Number 생성자 함수의 인수로 숫자가 아닌 값을 전달하면 인수를 숫자로 강제 변환 후 객체를 생성한다. 인수를 숫자로 변환할 수 없다면 Nan을 할당한 객체를 생성한다. |
| 18 | + |
| 19 | +new 연산자를 사용하지 않고 생성자 함수를 호출하면 Number 인스턴스가 아닌 숫자를 반환한다. |
| 20 | + |
| 21 | +```jsx |
| 22 | +const a = new Number(123); |
| 23 | +a === 123 // false |
| 24 | + |
| 25 | +const b = Number(123); |
| 26 | +b === 123 // true |
| 27 | +``` |
| 28 | + |
| 29 | +## 28.2 Number 프로퍼티 |
| 30 | + |
| 31 | +### 28.2.1 `Number.EPSILON` |
| 32 | + |
| 33 | +두 개의 표현 가능한 숫자 사이의 최소 간격. |
| 34 | + |
| 35 | +1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이($2.2204460492503130808472633361816\times10^{-16}$)이다. |
| 36 | + |
| 37 | +```jsx |
| 38 | +0.1 + 0.2; // 0.30000000000000004 |
| 39 | +0.1 + 0.2 === 0.3; // false |
| 40 | +``` |
| 41 | + |
| 42 | +부동소수점 산술 연산은 정확한 결과를 기대하기 어려운데, 이러한 오차를 해결하기 위해 사용할 수 있다. |
| 43 | + |
| 44 | +```jsx |
| 45 | +function isEqual(a, b) { |
| 46 | + return Math.abs(a-b) < Number.EPSILON; |
| 47 | +} |
| 48 | +isEqual(0.1+0.2, 0.3); // true |
| 49 | +``` |
| 50 | + |
| 51 | +두 수의 차이가 Number.EPSILON보다 작으면 같은 수로 인정하는 방식이다. |
| 52 | + |
| 53 | +### 28.2.2 `Number.MAX_VALUE` |
| 54 | + |
| 55 | +자바스크립트에서 표현할 수 있는 가장 큰 양수 값($1.7976931348623157 \times 10^{308}$)이다. 이것보다 큰 숫자는 `Infinity` 다. |
| 56 | + |
| 57 | +```jsx |
| 58 | +Infinity > Number.MAX_VALUE // true |
| 59 | +``` |
| 60 | + |
| 61 | +### 28.2.3 `Number.MIN_VALUE` |
| 62 | + |
| 63 | +자바스크립트에서 표현 할 수 있는 가장 작은 양수값($5 \times 10^{-324}$)이다. 이것보다 작은 숫자는 0이다. |
| 64 | + |
| 65 | +### 28.2.4 `Number.MAX_SAFE_INTEGER` |
| 66 | + |
| 67 | +자바스크립트에서 안전하게 표현할 수 있는 가장 큰 정수값(9007199254740991)이다. (= 53비트로 표현할 수 있는 가장 큰 정수 2^53 - 1) |
| 68 | + |
| 69 | +>[!note] |
| 70 | +>자바스크립트에서 숫자는 **64비트 부동소수점 형식**(IEEE 754 표준)을 사용하여 저장되고, 정수 부분에 대해 53비트만 사용한다. |
| 71 | + |
| 72 | +### 28.2.5 `Number.MIN_SAFE_INTEGER` |
| 73 | + |
| 74 | +자바스크립트에서 안전하게 표현할 수 있는 가장 작은 정수값(-9007199254740991)이다. (= 53비트로 표현할 수 있는 가장 작은 정수 -(2^53 - 1)) |
| 75 | + |
| 76 | +### 28.2.6 `Number.POSITIVE_INFINITY` |
| 77 | + |
| 78 | +양의 무한대를 나타내는 숫자값 Infinity와 같다. |
| 79 | + |
| 80 | +### 28.2.7 `Number.NEGATIVE_INFINITY` |
| 81 | + |
| 82 | +음의 무한대를 나타내는 숫자값 -Infinity와 같다. |
| 83 | + |
| 84 | +### 28.2.8 `Number.NaN` |
| 85 | + |
| 86 | +숫자가 아님(Not-a-Number)을 나타내는 숫자값이다. `window.NaN`과 같다. |
| 87 | + |
| 88 | + |
| 89 | +## 28.3 Number 메서드 |
| 90 | + |
| 91 | +### 28.3.1 `Number.isFinite` |
| 92 | + |
| 93 | +인수로 전달된 숫자값이 정상적인 유한수인지 검사하여 그 결과를 불리언값으로 반환한다. |
| 94 | + |
| 95 | +**빌트인 전역 함수 `isFinite`와 비교** |
| 96 | + |
| 97 | +- `isFinite`는 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행한다. |
| 98 | +- `Number.isFinite`는 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false이다. |
| 99 | + |
| 100 | +```jsx |
| 101 | +Number.isFinite(null); // false |
| 102 | +isFinite(null); // true |
| 103 | +``` |
| 104 | + |
| 105 | +null은 암묵적으로 숫자 0으로 변환되기 때문에 true가 반환되었다. |
| 106 | + |
| 107 | +```jsx |
| 108 | +Number.isFinite(NaN); // false |
| 109 | +isFinite(NaN); // false |
| 110 | +``` |
| 111 | + |
| 112 | +NaN은 숫자로 암묵적 타입 변환이 불가능하기 때문에 false가 반환되었다. |
| 113 | + |
| 114 | +### 28.3.2 `Number.isInteger` |
| 115 | + |
| 116 | +인수로 전달된 숫자값이 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사하기 전에 암묵적 타입 변환하지 않는다. |
| 117 | + |
| 118 | +```jsx |
| 119 | +Number.isInteger(0) // true |
| 120 | +Number.isInteger(123) // true |
| 121 | + |
| 122 | +Number.isInteger(0.5) // false |
| 123 | +Number.isInteger('123') // false |
| 124 | +Number.isInteger(true) // false |
| 125 | +Number.isInteger(null) // false |
| 126 | +``` |
| 127 | + |
| 128 | +### 28.3.3 `Number.isNaN` |
| 129 | + |
| 130 | +전달된 숫자값이 NaN인지 검사하여 그 결과를 불리언 값으로 반환한다. |
| 131 | + |
| 132 | +```jsx |
| 133 | +Number.isNaN(NaN); // true |
| 134 | +``` |
| 135 | + |
| 136 | +**빌트인 전역 함수 `isNaN`과 비교** |
| 137 | + |
| 138 | +- `isNaN`은 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행한다. |
| 139 | +- `Number.isNaN`은 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false다. |
| 140 | + |
| 141 | +```jsx |
| 142 | +Number.isNaN(undefined); // false |
| 143 | + |
| 144 | +// undefined는 NaN으로 암묵적 타입 변환된다. |
| 145 | +isNaN(undefined); // true |
| 146 | +``` |
| 147 | + |
| 148 | +### 28.3.4 `Number.isSafeInteger` |
| 149 | + |
| 150 | +인수로 전달된 숫자값이 안전한 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사전에 인수를 숫자로 암묵적 타입 변환하지 않는다. |
| 151 | + |
| 152 | +```jsx |
| 153 | +Number.isSafeInteger(0) // true |
| 154 | +Number.isSageInteger(Number.MAX_SAFE_INTEGER) // true |
| 155 | +Number.isSageInteger(Number.MAX_SAFE_INTEGER+1) // false |
| 156 | +``` |
| 157 | + |
| 158 | +### 28.3.5 `Number.prototype.toExponential` |
| 159 | + |
| 160 | +숫자를 지수 표기법으로 변환하여 문자열로 반환한다. |
| 161 | + |
| 162 | +지수 표기법이란 매우 크거나 작은 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승을 곱하는 형식으로 수를 나타내는 방식이다. 인수로는 소수점 이하로 표현할 자릿수를 전달할 수 있다. |
| 163 | + |
| 164 | +```jsx |
| 165 | +(77.1234).toExponential(); // '7.71234e+1' |
| 166 | +// 인수를 전달하지 않으면 전체 숫자를 반영한 지수 표기법을 사용한다. |
| 167 | + |
| 168 | +(77.1234).toExponential(4); // '7.7123e+1' |
| 169 | +(77.1234).toExponential(2); // '7.71e+1' |
| 170 | +``` |
| 171 | + |
| 172 | +### 28.3.6 `Number.prototype.toFixed` |
| 173 | + |
| 174 | +인수로 전달받은 소수점 이하 자리수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다. |
| 175 | + |
| 176 | +소수점 이하가 주어진 인수보다 길면 숫자를 반올림하고, 짧아서 부족할 경우 뒤를 0으로 채운다. 인수는 0~20 사이의 정수값이며 기본값은 0이다. |
| 177 | + |
| 178 | +```jsx |
| 179 | +var numObj = 12345.6789; |
| 180 | + |
| 181 | +// 소수점 이하 반올림. |
| 182 | +numObj.toFixed(); // '12346' |
| 183 | + |
| 184 | +// 소수점 이하 1자릿수 유효, 나머진 반올림 |
| 185 | +numObj.toFixed(1); // '12345.7' |
| 186 | + |
| 187 | +// 소수점 이하 6자릿수 유효, 부족한 부분은 0으로 채움 |
| 188 | +numObj.toFixed(6); // '12345.678900' |
| 189 | +``` |
| 190 | + |
| 191 | +### 28.3.7 `Number.prototype.toPrecision` |
| 192 | + |
| 193 | +인수로 전달받은 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다. |
| 194 | + |
| 195 | +인수로 전달받은 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다. 인수는 0~21 사이의 정수값이며 기본값은 0이다. |
| 196 | + |
| 197 | +```jsx |
| 198 | +var numObj = 12345.6789; |
| 199 | + |
| 200 | +numObj.toPrecision(); // '12345.6789' |
| 201 | + |
| 202 | +numObj.toPrecision(1); //'1e+4' |
| 203 | +numObj.toPrecision(2); // '1.2e+4' |
| 204 | + |
| 205 | +numObj.toPrecision(5); // '12346' |
| 206 | +``` |
| 207 | + |
| 208 | +| 특징 | `toFixed(digits)` | `toPrecision(precision)` | |
| 209 | +| --- | --- | --- | |
| 210 | +| 역할 | 소수점 이하 자릿수를 지정 | 전체 자릿수를 지정 | |
| 211 | +| 인자 | `digits`: 소수점 이하 유지할 자릿수 (0~100) | `precision`: 전체 유효 숫자 개수 (1~100) | |
| 212 | +| 반올림 여부 | 지정한 소수점 이하 자릿수에서 반올림 | 지정한 유효 숫자 개수에서 반올림 | |
| 213 | +| 지수 표기법 사용 | 사용하지 않음 (항상 고정 소수점) | 필요 시 지수 표기법 사용 | |
| 214 | +| 기본값 | `toFixed(0)`이면 정수 부분만 출력 | `toPrecision()` 호출 시 기본적으로 전체 유효 숫자를 출력 | |
| 215 | +| 사용 예시 | 화폐 단위처럼 소수점 이하 자릿수를 고정해야 할 때 | 과학 계산에서 정확한 유효 숫자 개수를 유지해야 할 때 | |
| 216 | + |
| 217 | +### 28.3.8 `Number.prototype.toString` |
| 218 | + |
| 219 | +숫자를 문자열로 변환하여 반환한다. |
| 220 | + |
| 221 | +진법을 나타내는 2~36 사이의 정수값을 인수로 전달할 수 있고, 기본값은 10이다. |
| 222 | + |
| 223 | +```jsx |
| 224 | +(10).toString(); // '10' |
| 225 | +(3).toString(2); // '11' |
| 226 | +``` |
| 227 | + |
| 228 | +### 숫자 리터럴과 함께 Number 프로토타입 메서드 |
| 229 | + |
| 230 | +를 사용할 경우 에러가 발생한다. |
| 231 | + |
| 232 | +```jsx |
| 233 | +77.toExponential(); // SyntaxError: Invalide or unexpected token |
| 234 | +``` |
| 235 | + |
| 236 | +점(.)은 소수 구분 기호 또는 프로퍼티 접근 연산자로 사용될 수 있는데, 자바스크립트 엔진이 숫자 뒤의 .을 소수 구분 기호로 해석해버려 toExponential()을 프로퍼티로 해석하지 못하기 때문이다. |
| 237 | + |
| 238 | +**해결 방법** |
| 239 | + |
| 240 | +1. 숫자 리터럴에 괄호를 씌우기 |
| 241 | + |
| 242 | + ```jsx |
| 243 | + (77).toExponential(); |
| 244 | + ``` |
| 245 | + |
| 246 | + 숫자 리터럴을 괄호로 감싸면 점(.)이 메서드 호출 연산자로 정확히 해석됨. |
| 247 | + |
| 248 | +2. 숫자 뒤에 .을 붙이기 |
| 249 | + |
| 250 | + ```jsx |
| 251 | + 77.1234.toExponential(); |
| 252 | + 77..toExponential(); |
| 253 | + ``` |
| 254 | + |
| 255 | + 첫 번째 .은 부동 소수점 숫자의 소수 구분 기호로 보고, 숫자에 소수점은 하나만 존재하므로 두 번째 .은 프로퍼티 접근 연산자로 해석된다. |
| 256 | + |
| 257 | +3. 숫자 뒤에 공백을 추가 |
| 258 | + |
| 259 | + ```jsx |
| 260 | + 77 .toExponential(); |
| 261 | + ``` |
| 262 | + |
| 263 | + 자바스크립트 숫자는 정수 부분과 소수 부분 사이에 공백을 포함할 수 없기 때문에 숫자와 . 사이에 공백이 오면 .을 프로퍼티 접근 연산자로 해석한다. |
0 commit comments