자바스크립트에서 "0.1 + 0.2 === 0.3"의 실행 결과

규갓 God Gyu·2025년 4월 10일

면접질문

목록 보기
112/142

false
부동소수점 형식의 한계 때문

JS에서 모든 숫자는 IEEE 754 표준을 따르는 64비트 부동소수점 형식으로 저장됨
이 방식은 일부 소수점 연산에서 정확한 값을 저장하지 못하는 한계를 가짐
ex - 0.1과 0.2를 이진수로 변환하면 무한 반복되는 소수로 표현되어 컴퓨터는 이를 근사값으로 저장함
이로 인해 겨로가적으로 0.1+0.2의 실제 값은 0.30000000000000004이여서 0.3과 일치하지 않음

오차 해결 방법?

특정 자릿수까지 반올림하는 것 toFixed(), toPrecision() 메서드 사용 가능
but 이 방법은 숫자가 문자열로 변환되는 부작용이 있음

다른 방법은 Number.EPSILON 을 활용하여 비교하는 것
Number.EPSILON은 자바스크립트에서 표현할 수 있는 가장 작은 수
이 값을 이용하여 두 수 비교하는 함수 작성할 수 있음

function isEqual(a, b) {
  return Math.abs(a - b) < Number.EPSILON;
}

console.log(isEqual(0.1 + 0.2, 0.3)) // true;

Math.abs(a-b) <= 절대값 구하는 함수

console.log(Math.abs(5));     // 5
console.log(Math.abs(-5));    // 5
console.log(Math.abs(0 - 1)); // 1

Number.EPSILON는 자바스크립트가 숫자를 비교할 때 허용하는 최소한의 차이

return Math.abs(a - b) < Number.EPSILON;
즉 이 로직은 a와 b의 차이가 거의 안난다면 같다고 보자 라는 의미

오차가 발생해도 JS가 부동소수점 표준을 채택한 이유?

  1. 성능 빠름(계산 빠름)
  2. 범용성(작은수~큰수)
  3. 실제 오차가 문제 되는 경우 적음
profile
웹 개발자 되고 시포용

0개의 댓글