자바스크립트(javascript) - number 타입(유형), 개념잡기

 

Number 타입에 대해 알아보자 (1) ~ (5) 까지 첫 번째 부터 보는 것을 권장한다.

 

아래 제목을 클릭하면 해당페이지 링크로 이동합니다

순번 링크페이지
1 JS - Number 타입에 대해 알아보자 - (1)
2 JS - Number 타입에 대해 알아보자 - (2)
3 JS - Number 타입에 대해 알아보자 - (3)
4 JS - Number 타입에 대해 알아보자 - (4)
5 JS - Number 타입에 대해 알아보자 - (5)

 

▶무한의 숫자

자바스크립트는 다른 언어(컴파일 언어 C언어 같은)와 달리 0으로 나눴을 때 에러 발생이 안 난다.

예로 들자면 10 나누기 0 이런 식을 계산 했을 때 Infinity라는 무한의 단어로 출력하게 된다.

 

이 무한에 대해서 자바스크립트는 어떻게 처리하는지 알아보자.

var numA = 10 / 0;
var numB = -10 * Number.MAX_VALUE;
var numC = Number.MAX_VALUE + Number.MAX_VALUE;
var numD = -Number.MAX_VALUE - Number.MAX_VALUE;

console.log(numA); // Infinity
console.log(numB); // -Infinity
console.log(numC); // Infinity
console.log(numD); // -Infinity

 

이렇게 자바스크립트는 IEEE 754 부동 소수점을 사용하므로 순수한 수학의 개념으로 생각하면 안 되고,

단순 덧셈, 뺄셈, 나눗셈, 곱셈으로도 오버플로가 되어 무한대 글자가 출력이 된다.

 

IEEE 754는 덧셈과 같은 연산이 너무 큰 값을 결정 지을 때 가장 가까운 숫자에 대해 반올림을 지정한다.

var numA = Number.MAX_VALUE;

var numB = Math.pow(2, 969);

var numC = Math.pow(2, 970);

console.log(numA); // 1.7976931348623157e+308
console.log(numB); // 4.9896007738368e+291
console.log(numC); // 9.9792015476736e+291

console.log(numA + numB); // 1.7976931348623157e+308
console.log(numA + numC); // Infinity



console.log(numA === (numA + numB)); // true

numA 변수는 자바스크립트에서 표현할 수 있는 최대의 정수이고,

numB 2의 969승의 값, numC는 2의 970승의 값

 

이렇게 각각 해당하는 값인데 numA + numB와 numA + numC를 더한 결괏값을 보자.

어떤가?

제대로 정확한 값이 계산되어서 나오는 게 아니라 가장 가까운 숫자에 대해 반올림되어

해당하는 숫자를 지정하게 된다.

 

즉, 다시 말해 numA는 표현할 수 있는 최대의 정수이고, 이 numA의 숫자에다가 numB(4.9896007738368e+291) 이 숫자를 더해도 그냥 최대 정수이다. 

 

그래서 numA + numB 결과를 보면 Number.MAX_VALUE 이 숫자와 같다.

비교를 해보면 true라는 것을 볼 때,  둘이 같은 숫자라는 것을 확인을 할 수 있다.

 

 

 

 

반응형

 

 

 

다른 예를 보면

numA + numC의 둘 숫자를 더한 결과이다.

이 둘의 숫자를 더했더니 최대의 정수 표현(Number.MAX_VALUE) 보다 큰 Infinity(무한)이라는 것이

출력이 되었다.

 

이처럼 자바스크립트는 엄청난 큰 수의 덧셈 연산을 할 때 이 처럼 표현할 수 있는 최대의 정수를

덧셈하면 그냥 최대의 정수를 표현하고 이보다 좀 더 큰 숫자를 더했을 때

그냥 Infinity라고 반올림하여 출력한다.

 

계산 참 간단하게 하네.. 이놈..

 

실제 개발에서 이렇게 까지 큰 수를 다루진 않지만 그래도 엄청나게 큰 수를

연산할 때 자바스크립트는 이렇게 연산을 한다는 정도로만 알고 있으면 될 것이다.

 

그리고 또 주의해야 할 게 있는데 자바스크립트는 한 번 무한대의 숫자가 되면

이거 다시 유한의 숫자로 돌이킬 수 없다.

 

이게 무슨 말이냐면 아래 예제를 보자.

var numA = Number.MAX_VALUE; // 1.7976931348623157e+308
var numC = Math.pow(2, 970); // 9.9792015476736e+291


var resultA = numA + numC;
var resultB = resultA - numA;


console.log(resultA); // Infinity
console.log(resultB); // Infinity

 

numA는 표현할 수 있는 가장 큰 정수

numC는 큰 수 속하는 정수

 

아까와 동일하게 두 개의 숫자를 더했을 때 (numA + numC) 결과는 무한이란 결과가 나왔다.

그런데 이 두 개의 더한 값에 다시 최대의 정수  numA를 빼면 어떨까?

순수한 수학의 개념으로 설명할 땐 numC의 값과 같아져야 하는 게 맞다.

 

그런데 자바스크립트는 한번 건넌 강은 다시 못 돌아온다...

그냥 무한대로 출력된다.. 

 

암튼 이런 개념을 가지고 있다. 자바스크립트는... 

반응형

+ Recent posts