0.1 + 0.2 == 0.30000000000000004
2017.08.23
TIL
자나깨나 부동소수점 조심
0.1 + 0.2 != 0.3
python에서 0.1
과 0.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의 경우 실수 객체가 분자/분모 정보를 갖고 있다.
결과도 결과지만 같은 값을 내기 위한 각 언어의 코드를 살펴보는 것도 꽤 흥미로웠다.