일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
Tags
- 자바스크립트
- algorithmStudy
- 재테크
- 독후감
- 자바
- 돈
- Java
- 지혜를가진흑곰
- 화장품
- algorithmtraining
- 알고리즘공부
- 성분
- 책을알려주는남자
- 서평
- 알고리즘 공부
- 프로그래밍언어
- 책알남
- 알고리즘트레이닝
- 프로그래머스 알고리즘 공부
- 채권
- algorithmTest
- C++
- 백준알고리즘
- 투자
- C
- 주식
- 경제
- JavaScript
- 독서
- 다독
Archives
- Today
- Total
탁월함은 어떻게 나오는가?
[JavaScript] Number() 메서드를 함부로 사용하면 안된는 이유와 예시 본문
[Snow-ball]프로그래밍(컴퓨터)/자바스크립트(JavaScript)
[JavaScript] Number() 메서드를 함부로 사용하면 안된는 이유와 예시
Snow-ball 2021. 12. 20. 00:17반응형
1
2
3
4
5
|
const num = Number.EPSILON;
console.log(num);
// 2.220446049250313e-16
console.log(typeof num);
// number
|
cs |
Number.EPSILON은 1에 더했을 때 1보다 큰 수를 만들어 낼 수 있는 가장 작은 양수이다.
Number.EPSILON보다 작은 수를 1에 더해도, 그 수는 1과 같다. 0이 아닌 양수를 1에 더했는데도 1이라는 사실은 터무니 없어보인다. 그 이유는 IEEE 754를 포함한 모든 고정 크기 부동소수점 시스템은 전부 이런 이상한 점을 가지고 있다. 숫자 표현의 크기를 고정함으로써 생기는 장단점이다.
1
2
3
|
const num2 = Number.MAX_SAFE_INTEGER;
console.log(num2);
// 9007199254740991 > 약 9천조
|
cs |
자바스크립트는 Number.MAX_SAFE_INTEGER 까지의 모든 정수형을 표현할 수 있으므로 다른 정수형 타입이 필요 없다. 자바스크립트의 숫자형은 부호를 포함한 54비트를 사용한다. Number.MAX_SAFE_INTEGER 보다 큰 수에 1을 더하는 것은 0을 더하는 것이나 마찬가지다. 자바스크립트는 값이나 연산 결과, 그리고 중간 연산 값들이 전부 -Number.MAX_SAFE_INTEGER와 Number.MAX_SAFE_INTEGER 사이의 정수 값인 경우에만 올바른 정수 연산을 할 수 있다.
이 범위 안에서는 일반적인 수학적 연산이 가능하다. 결합법칙과 분배법칙 역시 적용된다.
하지만 범위를 벗어나게 되면, 모든 것이 혼돈이 된다. 숫자를 더하는 순서에 따라서 그 합이 바뀔 수도 있다.
((0.1 + 0.2) + 0.3)의 결과 값이 (0.1 + (0.2 + 0.3))보다 더 클 수 있다는 뜻이다. Number.isSafeInteger(number)는 숫자가 안전한 범위 내에 있는 경우 true를 반환한다.
1
2
3
4
5
6
7
|
const num3 = Number.isInteger(1);
const num4 = Number.isInteger(9007199254740991);
const num5 = Number.isInteger(90071992547409919007199254740991);
console.log(num3); // true
console.log(num4); // true
console.log(num5); // true
|
cs |
Number.isInteger(number)는 숫자가 안전한 범위 안에 있든 그 밖에 있든 true를 반환한다.
Number.MAX_SAFE_INTEGER보다 큰 수는 정수로 간주하는데, 몇몇 경우에는 맞지만, 대부분 틀리다.
Number.MAX_VALUE는 자바스크립트가 표현할 수 있는 가장 큰 숫자를 의미한다. 그 값은 Number.MAX_SAFE_INTEGER * 2 ** 971 과 동일하다
Number.MAX_SAFE_INTEGER보다 큰 수는 정수로 간주하는데, 몇몇 경우에는 맞지만, 대부분 틀리다.
Number.MAX_VALUE는 자바스크립트가 표현할 수 있는 가장 큰 숫자를 의미한다. 그 값은 Number.MAX_SAFE_INTEGER * 2 ** 971 과 동일하다
1
2
3
4
5
6
|
const num6 = Number.MAX_VALUE;
console.log(num6);
// 1.7976931348623157e+308
const num7 = Number.MAX_SAFE_INTEGER * 2 ** 971;
console.log(num7);
// 1.7976931348623157e+308
|
cs |
이 값은 뒤에 308개의 숫자가 더 존재한다. 이 값의 대부분은 실제가 없는 유효숫자이다. 이 숫자는 15.9개의 유효 숫자를 제공할 뿐이다. 나머지 292개의 숫자는 밑수 2로는 10진수를 제대로 표현하지 못하기 때문에 생긴 값들이다.
Number.MAX_VALUE에 안전한 범위 안에 있는 어떤 양의 정수르 더해도 그 값은 여전히 Number.MAX_VALUE이다.
계산 결과로 Number.MAX_VALUE를 만드는 프로그램은 뭔가 잘못 되었을 가능성이 크다. Number.MAX_SAFE_INTEGER를 넘는 모든 결과는 이상할 수 있다.
IEEE 754 표준은 엄청나게 넓은 범위를 보장해 주기는 하지만, 각별히 신경 쓰지 않는 이상 실수로 이어지기 십상이다.
Number.MAX_VALUE에 안전한 범위 안에 있는 어떤 양의 정수르 더해도 그 값은 여전히 Number.MAX_VALUE이다.
계산 결과로 Number.MAX_VALUE를 만드는 프로그램은 뭔가 잘못 되었을 가능성이 크다. Number.MAX_SAFE_INTEGER를 넘는 모든 결과는 이상할 수 있다.
IEEE 754 표준은 엄청나게 넓은 범위를 보장해 주기는 하지만, 각별히 신경 쓰지 않는 이상 실수로 이어지기 십상이다.
1
2
|
const num8 = Number.MIN_VALUE;
console.log(num8); // 5e-324
|
cs |
Number.MIN_VALUE는 영(0)보다 큰 수 중에서 가장 작은 수이다.
1
2
|
const num9 = 2 ** -1074;
console.log(num9); // 5e-324
|
cs |
값은 2 ** -1074 와 동일하다. Number.MIN_VALUE보다 작은 양수는 영(0)과 구별이 불가느아다.
Number.MIN_VALUE의 유효 숫자는 최하위 비트 단 한개만 포함하고 있으며, 이 비트로 인해 수 없이 많은,
환상에 불과한 유효 숫자가 만들어진다.
Number.prototype은 모든 수가 상속하는 객체이다. Number.prototype은 많은 메서드를 포함하고 있지만
아쉽게도 그다지 유용하지 않은 듯 하다.
Number.MIN_VALUE의 유효 숫자는 최하위 비트 단 한개만 포함하고 있으며, 이 비트로 인해 수 없이 많은,
환상에 불과한 유효 숫자가 만들어진다.
Number.prototype은 모든 수가 상속하는 객체이다. Number.prototype은 많은 메서드를 포함하고 있지만
아쉽게도 그다지 유용하지 않은 듯 하다.
반응형
'[Snow-ball]프로그래밍(컴퓨터) > 자바스크립트(JavaScript)' 카테고리의 다른 글
<html>태그, 따옴표, 줄바꿈, 쌍따옴표를 JavaScript replace사용해서 제거하기 (0) | 2022.09.26 |
---|---|
[Java Script] reduce() 베열 및 데이터 변환으로 사용하는 방법 (0) | 2022.01.04 |
[JavaScript] 클로저(Closure),렉시컬 스코프(Lexical Scoping)이란 무엇일까? 사용 예제와 원리를 알아보자 (0) | 2021.12.01 |
[JavaScript] 해체 할당(구조 분해 할당)으로 객체 속성에 접근하는 방법 (0) | 2021.10.28 |
[JavaScript] 매개변수 기본값(Default Parameters)을 정확하게 사용하는법과 생성하는법 (0) | 2021.10.16 |
Comments