Whiteship's Note

'부동소수'에 해당되는 글 1건

  1. 2006.11.15 Java에서 실수 표현 부정확성 (19)

Java에서 실수 표현 부정확성

Java : 2006. 11. 15. 16:03


Agile Java 4장 번역서 p180~p181에 걸쳐 실수 표현의 부정확함에 대한 내용이 나옵니다. 어떤 문제가 있으면 어떻게 해결할 수 있을지 고민해 봅니다.

먼저 float로 테스트를 해봤습니다.

double로도 테스트를 해봤습니다.

해결책으로 제시된 방법은
1. 반올림을 사용한다.
2. BIgDecimal 클래스를 사용한다.

먼저 1번 방법을 사용해보려고 Math 클래스의 메소드들을 들여다 봤습니다. return type이 전부 정수 형태 입니다.

이걸 사용해서 실수를 반올림하면 조금 난감한 상황이 발생할 것 같습니다. -_-;;;

DecimalFormat class를 사용해봤습니다.

두 번째 방법인 BIgDecimal을 사용해보겠습니다.

번외로 Wrapper 클래스를 가지고도 해봤습니다.

참고할 곳 : http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1118831957&p=3&s=t
http://javaservice.net/~java/bbs/read.cgi?m=resource&b=qna2&c=r_p&n=1118716242&p=1&s=t#1118716242
http://docs.sun.com/source/806-3568/ncg_goldberg.html    <--- 완전 수학 문서;;

위에서 발생했던 이상한 현상(0.9, 0.9 같은데도 다르다고 하던 현상)이 민재님 덕분에 해결됐습니다. assertion을 할 때 같은 type끼리 비교를 해야되는데.. 하나는 double이고 하나는 BigDecimal이였기 때문에 같은 0.9여도 fail로 나온 것입니다.

assertion을 할 때 두개의 인자만 줄 수 있는 것이 아니라 세번째 인자도 줄 수가 있는데요. API를 보겠습니다.


top

  1. 찬욱 2006.11.15 16:45 PERM. MOD/DEL REPLY

    BigDecimal value = new BigDecimal(0.3);
    BigDecimal three = new BigDecimal(3);
    value = value.multiply(three);
    assertEquals(0.9, value);

    이 결과는 제대로 0.9가 나오지 않습니까?

    제가 5장 발표할 때 테스트 했을 때는 제대로 나왔는데요..흠;;;

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.15 16:49 신고 PERM MOD/DEL

    아니 안나오는데.. java.lang.AssertionError: expected:<0.9> but was:<0.899999999999999966693309261245303787291049957275390625>

    이렇게 나오는데~

  2. Favicon of http://px.tistory.com BlogIcon 민재 2006.11.18 01:13 PERM. MOD/DEL REPLY

    내일 회사 가서 이클립스 돌리고 후기를 적으마..
    이상해 보이긴 한다..

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 11:16 신고 PERM MOD/DEL

    네.. 0.9, 0.9 똑같이 만드는 방법은 알아냈는데. assertion을 통과 못하니깐 섭섭하네요. ㅠ.ㅠ

  3. Favicon of http://px.tistory.com BlogIcon 민재 2006.11.18 11:27 PERM. MOD/DEL REPLY

    BigDecimal의 경우는 생성자의 문제인듯...
    애자일자바 10장 초반부를 보면 이해가 될듯..

  4. Favicon of http://px.tistory.com BlogIcon 민재 2006.11.18 11:34 PERM. MOD/DEL REPLY

    assertEquals(0.9, value);

    같은 넘끼리 비교를 해야지... 땍.. ^^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 16:23 신고 PERM MOD/DEL

    ^^;;; 잘 이해가 되지 않는데요. 제가 어떤 실수를 한거죠?

    Favicon of http://px.tistory.com BlogIcon 민재 2006.11.18 19:06 PERM MOD/DEL

    0.9가 BigDecimal인가??

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 21:13 신고 PERM MOD/DEL

    아..... assertEquals(new BigDecimal(0.0), value);
    이렇게 해야되는거군요. :)

    감사합니다.

  5. Favicon of http://bumseokk.oranc.co.kr/tt BlogIcon 법석 2006.11.18 16:45 PERM. MOD/DEL REPLY

    허러리어...;;;

    역시 자바는 간단한 것도 그냥 안넘어가네요..ㅠ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 17:49 신고 PERM MOD/DEL

    별로 간단하지 않은 문제 같은데...ㅋㅋ; 이녀석 주말인데 여자친구 안만나고 내 블러그에서 사냐?

  6. Favicon of http://bumseokk.oranc.co.kr/tt BlogIcon 법석 2006.11.18 17:57 PERM. MOD/DEL REPLY

    뭐 일주일 내내 붙어 있는걸요..ㅋㅋㅋ
    형 블러그가 볼 게 많아서 재밌어요
    ㅋㅋ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 18:23 신고 PERM MOD/DEL

    그러냐.. 흠;; 난 이제 스타보러간다. 영종이랑 윤열이랑 결승하거든 ㅋㅋ

  7. Favicon of http://zerry82.tistory.com BlogIcon 현동규 2006.11.18 21:48 PERM. MOD/DEL REPLY

    흠.. 반올림 하는법이요.. 첫째짜리에서 반올림 ~_~///

    @Test
    public void doubleMultifly(){
    double value = 0.3 * 3;
    value = (double)Math.round(value * 10)/10;
    assertEquals(0.9, value);
    }

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 21:56 신고 PERM MOD/DEL

    ㅇㅇ그렇게 해도 되겠지.

    하지만 반올림이나 실수 잘릿수 맞추기 위한 API들이 있으니 그런걸 사용해서 보는 사람이 더 쉽게 이해할 수 있도록 사용하는게 좋을 것 같다는 생각이드네. :)

  8. Favicon of http://zerry82.tistory.com BlogIcon 현동규 2006.11.18 21:53 PERM. MOD/DEL REPLY

    디시멀 테스트 두번째꺼 이렇게 해보세용

    public void bigDecimalFormat(){
    BigDecimal value = new BigDecimal(0.3);
    BigDecimal three = new BigDecimal(3);
    MathContext mc = new MathContext(1);
    value = value.multiply(three, mc);
    assertEquals(0.9, value.doubleValue());
    }

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.18 21:56 신고 PERM MOD/DEL

    ㅇㅇ 새 글에 그렇게 올렸다. ㅋㅋㅋ 빠르네. 이거 완전 실시간이구만..

  9. 행인1 2008.10.21 17:20 PERM. MOD/DEL REPLY

    어언 2년이 지난 소스에 comment 는 뻘짓 같지만 BigDecimal 을 사용하실 경우 String으로 변환해서 사용하시면 정확한 결과를 얻을 수 있습니다.
    public void bigDecimalFormat(){
    BigDecimal value = new BigDecimal(String.valueOf(0.3));
    BigDecimal three = new BigDecimal(String.valueOf(3));
    value = value.multiply(three);
    assertEquals(0.9, value);
    }

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.10.21 22:28 PERM MOD/DEL

    오호.. 그렇군요. 감사합니다. :)

Write a comment.