프로그래머로서 컴퓨터 계산 오류, 특히 부동소수점(floating-point) 문제로 인한 0.1 더하기와 같은 오차에 대비하는 것은 정말 중요하고도 흥미로운 부분입니다. 이 문제를 예방하고 해결하기 위한 몇 가지 전략을 말씀드릴게요.
우선, 컴퓨터는 모든 숫자를 2진수로 처리합니다. 이때 0.1이나 0.2 같은 10진수 소수가 2진수로 변환될 때, 마치 1/3을 0.333...으로 표현하듯이 무한히 반복되는 경우가 생겨요. 컴퓨터는 정해진 메모리 크기 안에 이 숫자를 담아야 하기 때문에, 특정 지점에서 숫자를 잘라내게 되는데, 여기서 아주 미세한 오차가 발생합니다. 이 작은 오차들이 계산을 거듭하면서 쌓여 우리가 예상하지 못한 결과로 이어질 수 있는 거죠.
이러한 문제를 다루기 위한 방법들은 다음과 같습니다.
1. 정밀한 계산이 필수적인 경우 (금융, 과학 계산 등):
* `BigDecimal` 활용: 많은 프로그래밍 언어에서 `BigDecimal`과 같이 10진수 연산을 위한 정밀한 자료형을 제공합니다. 이는 숫자를 2진수로 변환하는 대신 10진수 그대로 처리하여 오차를 원천적으로 방지합니다. 자바의 `BigDecimal`이 대표적인 예시예요.
* 정수형으로 변환 후 계산: 모든 소수를 특정 배수(예: 100 또는 1000)를 곱해 정수형으로 만든 다음 계산을 진행하고, 마지막에 다시 나눠서 원래 소수점으로 돌리는 방법입니다. 예를 들어, 0.1 + 0.2를 (0.1 * 10) + (0.2 * 10) = 1 + 2 = 3으로 계산한 뒤, 다시 10으로 나누는 방식이죠.
2. 오차가 허용되는 범위 내에서 처리해야 할 경우:
* 반올림/버림 처리: 최종 결과값을 사용자에게 보여줄 때는 특정 소수점 자리에서 적절하게 반올림하거나 버림 처리하여 시각적인 오차를 줄일 수 있습니다. 이는 실제 계산에는 오차가 남아있지만, 사람이 인지하는 데는 문제가 없는 수준으로 맞추는 방법이에요.
* 오차 범위 내에서 비교: 두 개의 부동소수점 숫자가 같은지 비교할 때는 `A == B` 와 같이 정확히 일치하는지를 확인하는 대신, 두 수의 차이가 매우 작은 특정 값(epsilon)보다 작은지를 확인하는 방식을 사용합니다. 예를 들어, `|A - B| < 0.00000001` 이런 식으로요.
이러한 개념들을 이해하고 상황에 맞춰 적절한 전략을 사용하는 것이 현명한 프로그래밍 습관이 될 수 있겠습니다.