2012-12-18 5 views
1

나는 인터넷 검색을 통해 모두 다음과 같은 두 가지 중 하나가 소수점 두 자리까지 내릴 것이라고 말합니다.더블의 정확도 감소

double roundToFourDecimals(double d) 
{ 
    DecimalFormat twoDForm = new DecimalFormat("#.##"); 
    double myD = Double.valueOf(twoDForm.format(d)); 
    return myD; 
} 

double nextLon = (double)Math.round(bnextLon * 100.0)/100.0; 

하지만 어느 것도 나를 위해 작동하지 않습니다. double의 값은 3.3743984E7이며 결과는 같습니다. 무엇이 잘못 되었나요?

+0

희미하게도 Double의 사용 가능한 '정밀도'가 소수 자리를 넘어서도이 기능이 작동한다고 가정합니다. 곱셈이 효과를 발생시킬 수있는 컷오프 값이 있는지 알 수 있습니까? 그러나 _division_은 (분명히 백분위 수는 오랫동안 관계없이 사라지 겠지만 ...)? –

답변

5

아무런 문제가 없습니다. 3.3743984E7은 과학 표기법입니다. 즉 :

3.3743984E7 = 3.3743984 * 10^7 = 33743984 

33,743,984.0 둥근 2 소수점 이하 자릿수는 33,743,984.0입니다. 33743984.05918을 지정한 경우 33743984.06으로 반올림되지만, 두 출력은 모두 3.3743984E7으로 표시됩니다.은 (앞에 나온 의견 인해 @Sam에 의해 발견 무효 삭제되었습니다.)

I에게 can verify that your rounding code works :

public class Main { 
    public static void main(String[] args) { 
     double bnextLon = 275914.18410; 
     double nextLon = (double) Math.round(bnextLon * 100.0)/100.0; 
     System.out.println(bnextLon + " became " + nextLon); 
    } 
} 

275914.1841 became 275914.18

난 당신이 단순히 당신이 원하는 가치를 결정해야합니다 생각 그리고 당신이 원하는 어떤 가치. 이 코드는 여러분이 지정한 것을 정확하게 제공합니다.

+1

흠, 대답을 업데이트했습니다. 여전히 정확하지만'33743984.06'은'3.3743984E7'과 동의하지 않습니다. 10 진수는 반드시 반올림되지는 않습니다. 즉, '33743984.06'은 '3.374398406E7'입니다. – Sam

+0

@ Sam Ah, 좋은 지적입니다. 나는 그것이 컷오프라고 생각했지만, 그것은 훨씬 더 내려간 것 같다 [http://ideone.com/xT7w5l]. 그걸 바꿀거야. – Eric

+0

Eric : 첫 번째 명령을 다음으로 대체하십시오. double bnextLon = 3.1234567E7; 일어나고있는 것을 보게 될 것입니다. 그것은 돌아 가지 않습니다. 이중이 과학 표기법에있는 경우 작동하지 않습니다. 10 진수 표기법으로 변환하는 방법을 알아 내야합니다. 메모리에 저장되는 방법에는 차이가 있습니다. –

2

3.3743984E733743984 의미하므로 100 곱한 것은 다음 변경 아무것도 반올림하지 3374398400 제공하고 분할 되돌아 간다.

1E5으로 반올림해야합니다.