자바스크립트 숫자 비교할때 주의할 부분

NaN은 무엇과도 같지 않음

NaN값은 그 자신을 포함하여 무엇과도 같지 않다.

1
2
NaN === NaN //false
NaN == NaN //false

그럼 어떻게 숫자가 NaN인지 알아보느냐!
inNaN(x)함수를 사용하면 된다. isNaN 함수는 x가 NaN일때 true를 반환한다.

1
2
let NotNaN = "string";
isNaN(NotNan); //true

소수 비교하기

자바스크립트의 숫자는 모두 더블형식
더블형식은 실수를 말하는데 실수는 0.3000000000000000000000004처럼 작은 값을 포함하기도 한다. 그렇기 때문에 실수를 비교할 때에는 Number.EPSILON의 숫자형 상수를 이용하여 비교한다고 한다.

MDN에서는

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

라고 설명하고 있다. 두개의 더블(실수)형식이 같다고 할 수 있을 만큼 가까운 숫자인지 판단할때 일반적으로 사용하는 방법이라고 하니 걍 익혀두는게 좋을 듯

아래 예시로 좀 더 자시헤 보도록 할까…

1
2
3
4
5
6
let n = 0;
while(true){
n += 0.1;
if(n === 0.3) break;
}
console.log(`Stopped at ${n}`);

이렇게 하면 0.3에 멈출거라고 생각하지만 컴퓨터는 값을 내놓지 못하고 끝없이 돌아갔다. 창 멈춤…ㄷㄷㄷ

ㅎㄷㄷ

그래서 Number.EPSILON과 관계연산식을 써서 느슨하게 비교해야함.

1
2
3
4
5
6
let n = 0;
while(true){
n += 0.1;
if(Math.abs(n-0.3) < Number.EPSILON) break;
}
console.log(`Stopped at ${n}`); //Stopped at0.30000000000000004
공유하기 댓글