From 5db1085f77f96629831447f894c4a88de7d20188 Mon Sep 17 00:00:00 2001 From: jiwonkirn Date: Sun, 21 Feb 2021 14:09:26 +0900 Subject: [PATCH 1/3] Add Numberic separators and Bigint to 2.2 number type section --- pages/130-number.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/pages/130-number.md b/pages/130-number.md index aad3e8d..ecd8bd0 100644 --- a/pages/130-number.md +++ b/pages/130-number.md @@ -10,6 +10,7 @@ number 타입 리터럴에는 다음과 같은 것들이 있습니다. 0b111; // 2진수 리터럴 (binary literal) 0o777; // 8진수 리터럴 (octal literal) 0xf5; // 16진수 리터럴 (hexademical literal) +10_000 // 숫자 구분 기호 (Numeric Separators) ``` 2진수, 16진수 정수 리터럴은 표기법일 뿐, 내부적으로는 10진수 정수와 같은 형태로 다루어집니다. @@ -20,10 +21,22 @@ number 타입 리터럴에는 다음과 같은 것들이 있습니다. 0b1001101 === 77; // true ``` -number 타입의 값에 대해 `typeof` 연산을 해보면 `'number'`라는 결과가 나옵니다. +숫자 구분 기호 (Numeric Separators) 역시 프로그래머가 숫자를 가독성있게 읽기 위한 표기법일 뿐, 값은 10진수 형태로 저장됩니다. 달러에서 1000 단위로 구분 기호 `,`를 사용하는 것 처럼 `_`로 구분하는 것이 대표적인 예입니다. 숫자 구분 기호 (Numeric Separators)는 ES2021에 포함된 문법으로 [특정 브라우저 버전](https://caniuse.com/?search=Numeric%20Separators)에서만 사용할 수 있습니다. + +```js +10_000 // 10000 +25_125.00 // 25125 + +// n진수 리터럴에도 사용할 수 있습니다. +0b01010110_00111000 // 22072 +``` + +모든 number 타입 리터럴에 대해 `typeof` 연산을 해보면 `'number'`라는 결과가 나옵니다. ```js typeof 1; // 'number' +typeof 0x4d; // 'number' +typeof 10_000 // 'number' ``` ## 정수인지 실수인지 판별하기 @@ -100,10 +113,30 @@ x **= 5; 그러면 사람들은 왜 이런 오차를 그냥 놔두는 것일까요? 이는 **계산 상의 효율성**을 위한 것입니다. 컴퓨터의 저장용량은 한정되어 있고 내부적으로 0과 1밖에 다룰 수 없으므로, 이런 제약 아래에서 10진수 소수를 아주 빠르게 계산하기 위해서 컴퓨터 설계자들이 이런 선택을 한 것입니다. 원주율과 같은 무한소수를 정말로 오차없이 다루려면 무한한 저장용량과 무한한 계산 성능이 필요하겠죠? -다만, 금융 분야와 같이 조금의 오차도 허용되지 않는 분야에서는 이런 오차가 큰 문제가 될 수 있습니다. 이 때에는 전용 라이브러리를 사용해서 문제를 해결할 수 있습니다만, 역시 자릿수 제한이나 연산 상의 제약이 존재하고, 무엇보다도 연산 속도가 느립니다. 그래도 정확도 면에서는 내장 실수 연산을 사용하는 것보다는 훨씬 낫죠. +이러한 오차는 정수에서도 확인할 수 있습니다. 자바스크립트는 정수도 실수와 똑같은 방식(부동소수점)으로 처리하기 때문에 큰 정수에 대해서 다음과 같은 표현 및 연산의 오차를 보입니다. + +```js +10000000000000001 + 10000000000000002 // 20000000000000000 +12345678901234567890 // 12345678901234567000 +``` + +만약 금융 분야와 같이 조금의 오차도 허용되지 않는 분야라면, 이런 오차가 큰 문제가 될 수 있습니다. 이 때에는 전용 라이브러리를 사용해서 문제를 해결할 수 있습니다만, 역시 자릿수 제한이나 연산 상의 제약이 존재하고, 무엇보다도 연산 속도가 느립니다. 그래도 정확도 면에서는 내장 실수 연산을 사용하는 것보다는 훨씬 낫죠. 실수 연산을 하는 프로그램을 만들 때에는, 본인이 어떤 유형의 실수 연산을 필요로 하는지 미리 파악한 후, 어느 쪽을 선택할 지 결정해야 합니다. 내장 실수 연산으로는 부족하다는 결론을 내렸을 때에는, `decimal` 혹은 `big integer` 등의 키워드로 검색해서 관련 라이브러리를 찾아보세요. [이 링크](https://runkit.com/embed/iw9fpzeivj7g)에서 `bignumber.js` 라이브러리 예제를 확인해보세요. +만약 실수가 아닌 아주 큰 정수만 다루어도 된다면 ES2020에 포함된 BigInt Literal을 사용할 수 있습니다. 다만 최신 문법이기 때문에 [특정 브라우저 버전](https://caniuse.com/?search=Bigint)에서만 사용할 수 있습니다. + +```js +12345678901234567890n // 12345678901234567890n +BigInt(12345678901234567890) // 12345678901234567890n + +10000000000000001n + 10000000000000002n // 20000000000000003n + +// Bigint는 "bigint" 타입이므로 "number"타입과 연산할 수 없습니다. +typeof 10000n // "bigint" +10000 + 10000n // Uncaught TypeError: Cannot mix BigInt and other types +``` + 반올림 오차에 대한 자세한 내용을 알고 싶다면 [이 문서](http://floating-point-gui.de/basic/)를 읽어보세요. ## number 타입의 특이한 값들 From db7623b4510cac5993ab9b1fe30d09e13276fe49 Mon Sep 17 00:00:00 2001 From: jiwonkirn Date: Sun, 21 Feb 2021 14:41:06 +0900 Subject: [PATCH 2/3] Add ; --- pages/130-number.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pages/130-number.md b/pages/130-number.md index ecd8bd0..e825f62 100644 --- a/pages/130-number.md +++ b/pages/130-number.md @@ -24,11 +24,11 @@ number 타입 리터럴에는 다음과 같은 것들이 있습니다. 숫자 구분 기호 (Numeric Separators) 역시 프로그래머가 숫자를 가독성있게 읽기 위한 표기법일 뿐, 값은 10진수 형태로 저장됩니다. 달러에서 1000 단위로 구분 기호 `,`를 사용하는 것 처럼 `_`로 구분하는 것이 대표적인 예입니다. 숫자 구분 기호 (Numeric Separators)는 ES2021에 포함된 문법으로 [특정 브라우저 버전](https://caniuse.com/?search=Numeric%20Separators)에서만 사용할 수 있습니다. ```js -10_000 // 10000 -25_125.00 // 25125 +10_000; // 10000 +25_125.00; // 25125 // n진수 리터럴에도 사용할 수 있습니다. -0b01010110_00111000 // 22072 +0b01010110_00111000; // 22072 ``` 모든 number 타입 리터럴에 대해 `typeof` 연산을 해보면 `'number'`라는 결과가 나옵니다. @@ -36,7 +36,7 @@ number 타입 리터럴에는 다음과 같은 것들이 있습니다. ```js typeof 1; // 'number' typeof 0x4d; // 'number' -typeof 10_000 // 'number' +typeof 10_000; // 'number' ``` ## 정수인지 실수인지 판별하기 @@ -116,8 +116,8 @@ x **= 5; 이러한 오차는 정수에서도 확인할 수 있습니다. 자바스크립트는 정수도 실수와 똑같은 방식(부동소수점)으로 처리하기 때문에 큰 정수에 대해서 다음과 같은 표현 및 연산의 오차를 보입니다. ```js -10000000000000001 + 10000000000000002 // 20000000000000000 -12345678901234567890 // 12345678901234567000 +10000000000000001 + 10000000000000002; // 20000000000000000 +12345678901234567890; // 12345678901234567000 ``` 만약 금융 분야와 같이 조금의 오차도 허용되지 않는 분야라면, 이런 오차가 큰 문제가 될 수 있습니다. 이 때에는 전용 라이브러리를 사용해서 문제를 해결할 수 있습니다만, 역시 자릿수 제한이나 연산 상의 제약이 존재하고, 무엇보다도 연산 속도가 느립니다. 그래도 정확도 면에서는 내장 실수 연산을 사용하는 것보다는 훨씬 낫죠. @@ -127,14 +127,14 @@ x **= 5; 만약 실수가 아닌 아주 큰 정수만 다루어도 된다면 ES2020에 포함된 BigInt Literal을 사용할 수 있습니다. 다만 최신 문법이기 때문에 [특정 브라우저 버전](https://caniuse.com/?search=Bigint)에서만 사용할 수 있습니다. ```js -12345678901234567890n // 12345678901234567890n -BigInt(12345678901234567890) // 12345678901234567890n +12345678901234567890n; // 12345678901234567890n +BigInt(12345678901234567890); // 12345678901234567890n -10000000000000001n + 10000000000000002n // 20000000000000003n +10000000000000001n + 10000000000000002n; // 20000000000000003n // Bigint는 "bigint" 타입이므로 "number"타입과 연산할 수 없습니다. -typeof 10000n // "bigint" -10000 + 10000n // Uncaught TypeError: Cannot mix BigInt and other types +typeof 10000n; // "bigint" +10000 + 10000n; // Uncaught TypeError: Cannot mix BigInt and other types ``` 반올림 오차에 대한 자세한 내용을 알고 싶다면 [이 문서](http://floating-point-gui.de/basic/)를 읽어보세요. From 0de20c553ede0b069e255352a607ecfdf17cb4d1 Mon Sep 17 00:00:00 2001 From: jiwonkirn Date: Sat, 6 Mar 2021 20:19:34 +0900 Subject: [PATCH 3/3] Apply code review to BigInt part --- pages/130-number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/130-number.md b/pages/130-number.md index e825f62..6eec391 100644 --- a/pages/130-number.md +++ b/pages/130-number.md @@ -21,7 +21,7 @@ number 타입 리터럴에는 다음과 같은 것들이 있습니다. 0b1001101 === 77; // true ``` -숫자 구분 기호 (Numeric Separators) 역시 프로그래머가 숫자를 가독성있게 읽기 위한 표기법일 뿐, 값은 10진수 형태로 저장됩니다. 달러에서 1000 단위로 구분 기호 `,`를 사용하는 것 처럼 `_`로 구분하는 것이 대표적인 예입니다. 숫자 구분 기호 (Numeric Separators)는 ES2021에 포함된 문법으로 [특정 브라우저 버전](https://caniuse.com/?search=Numeric%20Separators)에서만 사용할 수 있습니다. +숫자 구분 기호 (Numeric Separators) 역시 프로그래머가 숫자를 가독성있게 읽기 위한 표기법입니다. 영어권에서 1000 단위로 구분 기호 `,`를 사용하는 것 처럼 `_`를 사용하여 가독성을 높이는 것이 여러 사용 예시 중 하나입니다. 숫자 구분 기호는 ES2021에 포함된 문법으로 [특정 브라우저 버전](https://caniuse.com/?search=Numeric%20Separators)에서만 사용할 수 있습니다. ```js 10_000; // 10000