자바스크립트에서 "0.1 + 0.2 === 0.3"의 실행 결과에 대해 설명해주세요.
분야: 프론트엔드
자바스크립트에서 0.1 + 0.2 === 0.3의 결과는 false입니다. 그 원인은 부동소수점 형식의 한계에 있습니다.
자바스크립트에서 모든 숫자는 IEEE 754 표준을 따르는 64비트 부동소수점 형식으로 저장됩니다. 이 방식은 일부 소수점 연산에서 정확한 값을 저장하지 못하는 한계를 갖습니다. 예를 들어, 0.1과 0.2를 이진수로 변환하면 무한 반복되는 소수로 표현되므로, 컴퓨터는 이를 근사값으로 저장합니다. 이로 인해 결과적으로 0.1 + 0.2의 실제 값은 0.30000000000000004가 되는데, 이는 0.3과 일치하지 않기 때문에 === 연산자로 비교하면 false가 반환됩니다.
이러한 오차를 해결하려면 어떻게 하나요? 🤔
가장 단순한 해결책은 특정 자릿수까지 반올림하는 것입니다. toFixed() 또는 toPrecision() 메서드를 사용할 수 있습니다. 다만 이 방법은 숫자가 문자열로 변환되는 부작용이 있습니다.
또 다른 방법은 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;
오차가 발생함에도 자바스크립트가 부동소수점 표준을 채택한 이유는 무엇인가요? 🧐
스스로 답변을 하는 연습을 해보세요. 🙂