2012-08-10 4 views
6

Java에서 int를 float로 변환하면 다음 예제 코드와 같이 정밀도가 손실 될 수 있습니다.Java에서는 int를 float로 암시 적으로 변환 할 수 있습니다. 왜?

public class Test { 
    public static void main(String [] args) { 
     int intVal = 2147483647; 
     System.out.println("integer value is " + intVal); 
     double doubleVal = intVal; 
     System.out.println("double value is " + doubleVal); 
     float floatVal = intVal; 
     System.out.println("float value is " + floatVal); 
     } 
} 

정밀도의 손실이있을 때 출력은,

integer value is 2147483647 
double value is 2.147483647E9 
float value is 2.14748365E9 

떠 INT의 암시 적 변환을 허용 뒤에 이유는 무엇입니까

입니까?

+0

중복 http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co –

+0

@ AaronKurtzhals : 그 질문은 다른 언어에 관한 것입니다. – Wug

답변

6

당신은 아마 궁금해 :

왜이 정보의 손실이 발생하는 암시 변환입니까? 명시 적 변환이 아니어야합니까?

물론 당신에게는 좋은 지적이 있습니다. 그러나 언어 디자이너는 대상 형식의 범위가 충분히 크면 정밀도가 떨어질 수는 있지만 암시 적 변환이 허용된다는 결론을 내 렸습니다. 정확도가 아닌 범위 인이 중요합니다. float는 int보다 큰 범위를 가지므로 암시 적 변환입니다.

Java specification 다음과 같은 말한다 :

하는 int 또는 long 값의 확장 변환이 떠있는, 또는 두 배로 긴 값의 정밀도의 손실이 발생할 수 있습니다 - 즉, 될 수 있습니다 값의 최하위 비트 중 일부를 잃게됩니다. 이 경우 결과로 생성되는 부동 소수점 값은 IEEE 754 가장 가까운 값으로 반올림 모드를 사용하여 올바르게 반올림 된 정수 값 버전이됩니다. 의

+0

왜 32 비트'float'가 64 비트'long'보다 더 넓은 것으로 간주 되는가? –

+2

@PeterLawrey : 부동 소수점은 -3.4e + 38 ~ 3.4e + 38 (약)의 범위를가집니다. long의 범위는 -9.2e18에서 -9.2e18입니다. float의 범위가 넓기 때문에 넓습니다. –

+0

아마 그 생각. 내가 가지고있는 문제는 우연히 'float'을 취하는 메서드에'long '을 전달할 때 64 비트의 정밀도를 24 비트로 바꿀 수 있다는 것입니다. P –

관련 문제