2012-03-07 2 views
0

결과가 다른 이유는 무엇입니까? 플로트를 사용하면 675가되고, 두 배를 사용하면 674 ... 이상한가?Java DecimalFormat이 float 및 double에 대해 다른 결과를 표시합니다.

float f = 12345.6745; 
double d = 12345.6745; 

Locale l = Locale.forLanguageTag("es-ES"); 
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(l); 
print(df.format(f)); 
>> 12.345,675 

l = Locale.forLanguageTag("es-ES"); 
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(l); 
print(df.format(d)); 
>> 12.345,674 

감사

+0

왜냐하면'float'과'double'은 같지 않기 때문입니다. ;) –

답변

7

내가 떠 사용하는 경우는, 675를 얻고 난 두 번 사용하는 경우 내가 그 이상한 밤은 ..., 674을 얻을?

특히. 다른 값의 서식을 지정하는 중입니다. 특히, float은 안정적으로 7

둘의 나타냅니다 당신이 9 자리 숫자를 지정 있어, 비록 그것이 (플로트에 대한 f 접미사)를 컴파일 할 수 있도록 당신이 실제로 코드를 변경 가정 숫자는 정확히 12345.6745입니다. 사실, 정확한 값은 다음과 같습니다들에

f = 12345.6748046875 
d = 12345.674499999999170540831983089447021484375 

봐 세 번째 소수점 자리가 d에 대한 f 4 5 이유는 명백하다.

소수 자릿수를 유지하려면 BigDecimal을 고려해야합니다.

2

표현 오류가 발생했습니다. 오버플로가있을 때 더 분명합니다.

long l = 123456789L; 
double d = l; 
float f = l; 
int i = (int) l; 
short s = (short) l; 
char ch = (char) l; 
byte b = (byte) l; 
System.out.println("l= " + l + " in hex " + Long.toHexString(l)); 
System.out.println("d= " + d); 
System.out.println("f= " + f); 
System.out.println("i= " + i + " in hex " + Integer.toHexString(i)); 
System.out.println("s= " + s + " in hex " + Integer.toHexString(s & 0xFFFF)); 
System.out.println("(int) ch= " + (int) ch + " in hex " + Integer.toHexString(ch)); 
System.out.println("b= " + b + " in hex " + Integer.toHexString(b)); 

인쇄

l= 123456789in hex 112210f47de98115 
d= 1.23456789E18 
f= 1.23456794E18 
i= 2112454933 in hex 7de98115 
s= -32491 in hex 8115 
(int) ch= 33045 in hex 8115 
b= 21 in hex 15 

long는 (플러스의 BigInteger와 BigDecimal를) 다른 모든 데이터 유형이 서로 다른 오류가 오류없이이 값을 나타낼 수 있습니다. floatdouble은 최상위 비트를 정확하게 나타내는 반면, int, short, charbyte은 가장 낮은 비트를 정확하게 나타낸다.

관련 문제