자바에서 간단한 계산이 안 되네요.
글쓴이: smallhuman / 작성시간: 월, 2016/03/28 - 3:35오후
코드는 다음과 같습니다. 너무 간단해서 오해의 여지가 없음.
package pj1; public class HelloWorld { public static void main(String[] args){ double a = 1.2; double b = 1.4; System.out.println(a+b); } }
근데 결과가 2.5999999999999996 으로 나옵니다.
truncation error도 아니고 도대체 뭘까요?
jre는 1.8.0_77, 이클립스 마르스에서 나온 결과입니다.
Forums:
floating point 의 표현 방식때문이죠
자세한건
https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
여기랑
https://en.wikipedia.org/wiki/Floating_point#Internal_representation
를 참조 하시구요.
간단히 말씀 드리면 0.1, 0.2... 이런 값을 binary 값으로 "정확하게" 표현 할 수 없다는 이야기입니다.
그래서 표현할때 허용할만한(?) 근사치를 이용하여 표현을 한다는거고.
그렇기 때문에 위와 같은 결과가 나온겁니다.
이에 대한 설명이 위 두 링크에 나와 있습니다.
그리고 아래 링크는.. 엑셀 2007 에서 위와 같은 binary floating point precision issue 를 어떻게 해결 하였는지를 보여주고 있습니다.
시간 되시면 한번 읽어보시고..
http://www.joelonsoftware.com/items/2007/09/26b.html
Ah... 감사합니다.
대충 그쪽 문제라고 생각은 했었는데 이런 간단한 레벨에서도 생겨날줄은 몰랐습니다. 왜 조건식에 real이나 float를 쓰지 말라고 하는지 알겠네요. 답변 감사합니다.
참고로, 파이썬에서도 똑같이
참고로, 파이썬에서도 똑같이 나옵니다.
float/double 등의 실수형 자체의 한계이므로 당연한 결과입니다.
1.2와 1.4 모두 2진수로 표현할 경우엔 순환소수입니다.
따라서 1.2와 1.4를 2진수로 저장하는 순간 하위자릿수들이 잘려나가게 되고
둘을 더하는 과정에서 하위 한 비트가 또 잘려나가게 됩니다.
계산을 거듭할수록 오차는 누적되는 것이고요.
모든 소수가 이진수로 표현시 이런 문제가 생기는 것은 아니고
예를 들어 1.5라든지 1.25같은 수는 정확히 이진수 표현이 가능합니다만
계산과정에서 오차가 누적되는 것은 피하지 못하죠.
초보 프로그래머가 정수들만의 세계에서 한 발짝 내딛는
초보 프로그래머가 정수들만의 세계에서 한 발짝 내딛는 순간 반드시 한 번은 빠지는 함정이지요.
너무 유명해서 누군가는 아예 이런 도메인까지 걸어 놓기도 하더군요. :)
http://0.30000000000000004.com/
+1
센스있네요 ㅋㅋㅋㅋ
저는 이렇게 생각했습니다.
댓글 달기