0.1 + 0.2 == 0.30000000000000004


이번 글을 보는 사람들은 이미
0.1 + 0.2의 결과를 보고
당황스러움을 경험했을듯 싶다.

눈을 의심해봤자 소용없다.
컴퓨터는 0.1 + 0.2를 계산하지못한다는걸 받아들이자.
조금더 정확하게 얘기하면
2진수는 10진수 0.1을 정확하게 변경 할 수 없게끔 만들어졌다.

이유는 다음과 같다.

우선, 몸풀기로 10진수 정수를 2진수로 변환해보면
5(10) -> 101(2) = 2^2 + 2^0 이다.

그럼 소수를 다뤄보자
0.5(10)을 2진수로 변경하면 0.1(2)이 된다.

뒤에 0.1은 2^-1 이다.
그러므로 0.01(2) -> 2^-2 -> 0.25 이다.
반면에 0.1(10)은 0.0001100110011... (2) 이다.
(1/3을 십진수로 표시못하는 이유와 비슷하다)

즉 소수부분이 순환소수가 아니라 딱 떨어지는 수가 되려면
An = 1/2n 으로 표현되는 수들의 합으로 이루어지는 수가 되어야하고
그렇지 않는 수들은 전부 반올림이 필요한 소수가 된다.

결론적으로
소수 연산이 필요하다면 우선 정수로 변환을 해서 계산을하고
소수로 변경해줘야 할 듯 싶다.




댓글

이 블로그의 인기 게시물

[spring] log4j 설정 및 사용법

[linux] 백그라운드 작업 nohup [xxx.sh] &

[spring] 인터셉터 와 필터