2016-12-31 4 views
0

Java 8에서 일부 과학적 계산을 수행하기 위해 작성된 이전 Java 6 프로그램을 다시 작성하고 반올림 연산에 대해 다른 결과를 얻는이 상황에 갇혀 있습니다.Java 6 및 Java 8의 다른 반올림 결과

Java 6은 0.499999999999999999994에서 1과 같은 입력을 반올림하지만 Java 8은 0과 같이 입력을 반올림합니다. 나는 여기서 문제를 이해할 수 없다. 예를 들어

:

private void foo() { 
    System.out.println(Math.round(0.499999999999999999994)); 
} 

위의 코드는 다른 자바 버전을 다르게 동작합니다.

누군가가이 문제에 대해 밝힐 수 있다면 좋을 것입니다.

+0

자바 6 및 자바 8 코드 – Aaron

+0

@Aaron 게시 기본 코드가 포함되어 있습니다. 귀하의 의견에 감사드립니다. –

답변

2

Java 6의 버그가 발견되어 나중에 Java 7에서 수정되었습니다. 이상한 코드 동작이 Java 6Java 8입니다.

버그 정보 :

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675

@OliverCharlesworth하여 더 많은 정보와 아름다운 설명은이 게시물에서 찾을 수 있습니다

: 자신의 게시물에서

Why does Math.round(0.49999999999999994) return 1

발췌 :

Java 6 (및 아마도 이전 버전)에서 round (x)는 floor (x + 0.5)로 구현됩니다. 이것은 사양 버그입니다. 정확하게이 경우 병리학 적 사례입니다. Java 7에서는이 깨진 구현을 더 이상 요구하지 않습니다.

+0

감사합니다. 이 문제가 수정 되었습니까? –

+0

중복 질문으로 마감하는 것이 더 적합 할 수도 있습니다 – weston

+2

@ ShivamNegi를 수정하는 것이 무엇을 의미합니까? 이제 수정되었으므로 Java 8에서 다시 중단하거나 Java 6에서 수정 사항을 거꾸로 적용 하시겠습니까? – weston

1

예제 출력이 0 인 이유는 다릅니다. 0.999999999999999999994double입니다. double에 캐스팅하면 double 값의 소수 자리가 삭제됩니다. 당신이 정확한 값에 의존하는 경우

public class Example { 
    public static void main(String[] args) { 
     double d1 = 0.9; 
     Double D1 = Double.valueOf(d1); 
     int d1AsInt = (int)d1; 
     System.out.println("d1 as int:\t" + d1AsInt); 
     System.out.println("d1 as int:\t" + D1.intValue()); 
    } 
} 

당신은 BigDecimalBigInteger를 사용해야합니다.

+0

혼란스러운 코드에 대해 죄송합니다. 나는이 행동을'Math.round()'와 함께 보았습니다. –