loading

자바스크립트(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)

 


 

▶ 매우 작은 값

이진 부동 소수점 숫자를 이용하여 덧셈 계산 시 오류가 나는 것을 확인할 수가 있다.

아래 예시를 봐 보자.

console.log((0.1 + 0.2) === 0.3); // false

 

 

두개의 소수점을 더한 결과가 0.3인데 두 개를 참 거짓으로 비교과를 해보면.. 거짓으로 나온다.

모든 소수점 계산이 다 그렇다는건 아니고 0.1과 0.2 같은 작은 숫자에 대해서만 이렇다.

 

이진 부동 소수점에서 0.1 과 0.2에 대한 표현 값이 정확하지 않아 더할 때 결과는

정확하게 0.3이 되는 게 아니라는 이유라고 한다.

즉, 실제 값은 0.30000000000000000000004 머 이렇다는 거다...

 

근데 이게 자바스크립트뿐만 그러는 게 아니라 IEEE 754를 사용하는 모든 언어는 다 이렇다는 거다.

이러한 버그 같은? 오류를 범하는 것을 왜 고치지 않느냐?

이럴 수 있는데 이게 말처럼 쉽게 해결될게 아니라고 한다.

 

머.. 얘기로는 수년 동안 대안이 많이 제시되었지만 해결은 안 됐고,

앞으로도 해결될 기미가 보이질 않다는 게 중요하다.

 

 

그래서 자바스크립트에서는 이러한 부분을 해결할 방법이 있는데

반올림 오차 값을 비교 허용오차로 사용하는 것인데

 

이 작은 값을 머신 엡실론을 사용하면 된다.

아래 링크된 MDN 개발자 사이트 가서 확인해보자.

머신 엡실론 링크

 

Number.EPSILON - JavaScript | MDN

Number.EPSILON 속성(property)은 Number 형으로 표현될 수 있는 1과 1보다 큰 값 중에서 가장 작은 값의, 차입니다.

developer.mozilla.org

 

이 엡실론 정의는  Number형으로 표현될 수 있는 1과 1보다 큰 값 중에서 가장 작은 값의 차이며,

이 엡실론의 속성은 대략 2 곱하기 10의 마이너스 52승 (2^-52)의 값을 갖는다.

 

function numbersEqual(num1, num2){
	return Math.abs(num1 - num2) < Number.EPSILON;
}

var numA = 0.1 + 0.2;
var numB = 0.3;


console.log(numbersEqual(numA, numB)); // true

 

이렇게 Number.EPSILON을 사용하면 두 숫자를 반올림 오차 허용 범위 내에서 비교를 할 수 있다.

그래서 위 코드에서 처럼 0.1 + 0.2 === 0.3 이 true 가 나온다.

 

 

 

 

반응형

 

 

▶ 안전하게 표시될 수 있는 최대 정수(Number.MAX_SAFE_INTEGER)

안전하게 표시될 수 있는 최대의 정수는 Number.MAX_VALUE 보다 훨씬 작은 숫자이다.

Number.MAX_VALUE : 1.79E+308

Number.MAX_SAFE_INTEGER(약 9000조 정확한 값 : 9007199254740991) : -(2E+53 - 1) ~ (2E+53 - 1)

 

여기서 안전함이란 무엇을 의미하는가?

정수를 올바르게 비교할 수 있는지를 의미한다.

 

예를 봐 보자. 아래 예제는 MDN 개발자 사이트에서 발취한 것

const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;

console.log(Number.MAX_SAFE_INTEGER);
// expected output: 9007199254740991

console.log(x);
// expected output: 9007199254740992

console.log(x === y);
// expected output: true

 

 

위 코드를 보면 안전한 정수의 범위 Number.MAX_SAFE_INTEGER(9007199254740991) 

이 수치보다 1만큼 또 2만큼 더해서 안전한 정수의 범위를 벗어나게 만든 숫자를

변수 x와 변수 y에 담아서 비교를 해보면

 

x === y는 true를 반환한다... 위 값을 console.log 출력해보면 다른데 말이다. 

즉, 안전한 범위 수치를 벗어난 정수 비교는 불가이다.

 

이유는??

이 자바스크립트가 IEEE 754에 기술된 배정밀도 부동소수점 형식 숫자 체계를 사용해서 그렇다...

즉, IEEE 754를 사용하는 모든 언어가 다 그렇다는 것이다.

그래서 안전한 정수 범위의 숫자만 유효하게 비교 가능하다.

반응형

+ Recent posts