0.1 + 0.2 != 0.3

python에서 0.10.2를 더해보면 산수 상식과는 좀 다른 값이 나온다.

$ python
Python 2.7.10
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False

물론 python만의 문제는 아니다.

$ node
> 0.1 + 0.2
0.30000000000000004
> 0.1 + 0.2 === 0.3
false

원인은 당연히 둥둥소수점 문제이고, 사용할 때 조심하면 된다고 생각해왔다.

그런데 며칠 전에 접한 Perl6에서는 아래와 같이 깔끔한 결과가 나오는 것이었다.

$ perl6
> 0.1 + 0.2
0.3
> 0.1 + 0.2 == 0.3
True

관심이 생겨 조사해보니 https://0.30000000000000004.com라는 곳에 프로그래밍 언어별로 0.1 + 0.2 연산을 수행했을 때의 결과가 잘 정리되어 있다.

그리고 몇몇 언어들의 경우 어떤 방식으로 이 문제들을 처리하고 있는지에 대한 설명도 짤막하게 달려 있다.

가령 Groovy는 소수점 리터럴 표현의 경우 java.math.BigDecimal로 처리를 하고 있으며, Perl6의 경우 실수 객체가 분자/분모 정보를 갖고 있다.

결과도 결과지만 같은 값을 내기 위한 각 언어의 코드를 살펴보는 것도 꽤 흥미로웠다.

Links