본문 바로가기
Background
개발/JS

console.log(0.1+0.2)의 답은 0.3이 아닙니다.

by BellRiver_Lee 2024. 11. 26.

여러분 혹시 console.log(0.1 + 0.2);의 답에 대해서 0.3일 거라고 생각하신다면 아쉽게도 아닙니다.
답은 0.30000000000000004입니다.

뭔가 싶지요.
제가 그랬거든요.

결론부터 말씀드리면 이는 부동소수점(floating-point) 연산의 정밀도 한계 때문입니다.
이 현상은 JS뿐만 아니라 대부분의 프로그래밍 언어에서 나타나며,
컴퓨터가 숫자를 이진법으로 표현하기 때문에 발생하는 문제입니다.


부동소수점 연산의 특징

  1. 이진 부동소수점 표기법
    •  0.1과 0.2는 이진법에서 무한소수로 표현됩니다.
      •  0.1은 0.000110011001100... (무한 반복)
      •  0.2는 0.00110011001100... (무한 반복) 컴퓨터는 무한 반복 소수를 저장할 수 없으므로, 유한한 비트로 근사치를 저장합니다.
      •  이 근사치로 인해 0.1 + 0.2 계산 결과가 정확히 0.3이 되지 않고 0.30000000000000004가 됩니다.
  2. 컴퓨터는 숫자를 2진법으로 변환해 저장합니다.
  3. IEEE 754 표준 (IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준.)
  4. 자바스크립트는 IEEE 754 표준을 사용해 숫자를 64비트 부동소수점으로 표현합니다.
    이 표준은 대부분의 언어에서 동일하게 사용되며, 정밀도 제한으로 인해 이러한 오차가 발생합니다.

해결 방법(소수를 정확히 계산하는 법):

1. toFixed() 또는 toPrecision() 사용

결과를 문자열로 변환하면서 원하는 소수점 이하 자리수로 반올림합니다.

console.log((0.1 + 0.2).toFixed(1)); // "0.3"
console.log((0.1 + 0.2).toPrecision(1)); // "0.3"
  • 주의: toFixed()는 결과를 문자열로 반환하므로, 숫자로 다시 사용하려면 parseFloat()가 필요합니다.

 

2. 정수 연산으로 변환

소수점 연산을 피하기 위해 숫자를 정수로 변환한 후 계산합니다.

const result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result); // 0.3

이 방식은 소수점 연산에서 발생하는 오차를 해결할 수 있으나 다소 번거로울 수 있습니다.

 

3. 외부 라이브러리 사용

정확한 소수 계산이 중요한 경우, 소수점 계산에 특화된 라이브러리를 사용하는 것이 좋습니다.
대표적인 라이브러리는 아래와 같습니다.


결론

소수점 연산의 정밀도가 중요한 경우에는 정수 연산이나 전용 라이브러리를 사용하는 것이 가장 안전합니다.

여러분이 세금 계산을 하는 프로젝트를 진행하시거나, 만, 억, 조 단위의 숫자를 셈해야 하는 개발 상황 상황에서는 이런 예상치 못한 이유로 난관에 빠질 수 있습니다.
위와 같은 문제는 짐작할 수 있는 부분도 아니고 우연히 주변에 이러한 문제의 이유를 아는 사람이 있어야지만 해결할 수 있습니다.

이럴 때 여러분이 위 문제를 인지하고 해결할 수 있는 사람이 되어 위상을 높여 보시기를 바랍니다.

그럼 다들 좋은 하루 보내세요!

728x90
반응형