자바에서 간단한 계산이 안 되네요.

smallhuman의 이미지

코드는 다음과 같습니다. 너무 간단해서 오해의 여지가 없음.

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, 이클립스 마르스에서 나온 결과입니다.

akayong의 이미지

자세한건

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

smallhuman의 이미지

대충 그쪽 문제라고 생각은 했었는데 이런 간단한 레벨에서도 생겨날줄은 몰랐습니다. 왜 조건식에 real이나 float를 쓰지 말라고 하는지 알겠네요. 답변 감사합니다.

chanik의 이미지

참고로, 파이썬에서도 똑같이 나옵니다.

print(1.2 + 1.4)
2.5999999999999996

float/double 등의 실수형 자체의 한계이므로 당연한 결과입니다.

1.2와 1.4 모두 2진수로 표현할 경우엔 순환소수입니다.
따라서 1.2와 1.4를 2진수로 저장하는 순간 하위자릿수들이 잘려나가게 되고
둘을 더하는 과정에서 하위 한 비트가 또 잘려나가게 됩니다.

계산을 거듭할수록 오차는 누적되는 것이고요.

모든 소수가 이진수로 표현시 이런 문제가 생기는 것은 아니고
예를 들어 1.5라든지 1.25같은 수는 정확히 이진수 표현이 가능합니다만
계산과정에서 오차가 누적되는 것은 피하지 못하죠.

익명 사용자의 이미지

초보 프로그래머가 정수들만의 세계에서 한 발짝 내딛는 순간 반드시 한 번은 빠지는 함정이지요.
너무 유명해서 누군가는 아예 이런 도메인까지 걸어 놓기도 하더군요. :)

http://0.30000000000000004.com/

HDNua의 이미지

센스있네요 ㅋㅋㅋㅋ

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.