2014-09-12 5 views
0

DecimalFormat에 문제가 있습니다. 내 코드에서 내가 가진 : 값 포맷하면 내가 출력 등이 있고,DecimalFormat : 쉼표 뒤에 잘못된 숫자가 표시됩니다.

1.40

을하지만 :

Double value = 1.40; 
DecimalFormat df = new DecimalFormat("###,###,###.00########"); 
df.setGroupingUsed(true); 
df.setDecimalSeparatorAlwaysShown(true); 
System.out.println(df.format(value)); 

을 자,이 코드로, theoritically, 내가해야 이 :

1.3999999762

왜 이런 일이 발생합니까? 어떻게 해결할 수 있습니까? 답변 주셔서 감사합니다!

+1

다음을 확인하십시오. http://ideone.com/SiUO90 –

+0

그래, 재현 할 수 없습니다. 너 한테 우리 한테 말 안했어? 이 코드가 정확히 실행중인 것입니까? –

+0

첫 줄에'Double value = 1.40F;'를 쓰지 않았습니까? –

답변

0

이것은 DecimalFormat의 문제가 아니며, the way binary float point numbers work의 문제입니다. 특정 숫자는 이런 식으로 표현할 수 없으므로 귀하의 경우와 같이 근사치를 얻을 수 있습니다.

BigDecimal을 사용하는 것이 해결책입니다.

+2

그보다 더 많은 것이 있습니다. ''1.3999999762'보다'1.40'에 훨씬 더 가까운'double '값들이 많이 있습니다. –

+0

@DavidWallace 1.3999999762는 올바른 숫자입니다. – LionC

+1

아니요, 그렇지 않습니다. 복식은 이보다 훨씬 중요한 자릿수까지 정확합니다. 이것이 double이 아닌 float 인 경우 이것은 정확합니다. –

0

DecimalFormat을 직접 사용하지 마십시오. 이 같은 시도 할 수 있습니다 :

IDEONE

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY); 
if (f instanceof DecimalFormat) { 
    ((DecimalFormat) f).applyPattern("###,###,###.00########"); 
} 
BigDecimal 좋은 대안이다 사용.

오라클 문서는 말한다 :

가 기본 로케일 등의 특정의 로케일의 NumberFormat를 취득하는 NumberFormat의 팩토리 메소드의 1 개, 같은 의 getInstance()를 호출합니다. 일반적으로 은 NumberFormat 팩토리 메소드가 일 때 DecimalFormat이 아닌 서브 클래스를 리턴 할 수 있기 때문에 DecimalFormat 생성자를 직접을 호출하지 않습니다.

관련 문제