자바스크립트(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형으로 표현될 수 있는 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를 사용하는 모든 언어가 다 그렇다는 것이다.
그래서 안전한 정수 범위의 숫자만 유효하게 비교 가능하다.
'web 언어 > HTML5 & CSS & Javascript' 카테고리의 다른 글
JS - Number 타입에 대해 알아보자 - (5) (0) | 2022.04.08 |
---|---|
JS - Number 타입에 대해 알아보자 - (4) (0) | 2022.04.07 |
JS - Number 타입에 대해 알아보자 - (2) (0) | 2022.04.05 |
JS - Number 타입에 대해 알아보자 - (1) (0) | 2022.04.04 |
JS - Array(배열) 과 String(문자열) 착각과 오해를 불러 일으킬 수 있는 부분들 바로 이해하기 (0) | 2022.04.01 |