2012-08-10 22 views
6

En Java, podemos convertir un int a float implícitamente, lo que puede dar como resultado la pérdida de precisión como se muestra en el siguiente código de ejemplo.Java permite la conversión implícita de int a float. ¿Por qué?

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); 
     } 
} 

La salida es

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

¿Cuál es la razón detrás de lo que permite la conversión implícita de int a flotar, cuando hay una pérdida de precisión?

+0

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

+0

@ AaronKurtzhals: Esa pregunta se refiere a un idioma diferente. – Wug

Respuesta

6

Probablemente se preguntan:

¿Por qué es esto una implícita conversión cuando hay una pérdida de la información? ¿No debería ser una conversión explícita?

Y usted, por supuesto, tiene un buen punto. Pero los diseñadores del lenguaje decidieron que si el tipo de objetivo tiene un rango lo suficientemente grande, entonces se permite una conversión implícita, aunque puede haber una pérdida de precisión. Tenga en cuenta que es el rango que es importante, no la precisión. Un flotante tiene un rango mayor que un int, por lo que es una conversión implícita.

El Java specification dice lo siguiente:

una conversión de ampliación de un int o un valor de tiempo para flotar, o de un valor largo para doblar, puede resultar en la pérdida de precisión - es decir, el resultado puede perder algunos de los bits menos significativos del valor. En este caso, el valor del punto flotante resultante será una versión redondeada correctamente del valor entero, usando el modo IEEE 754 de redondeo a más cercano.

+0

¿Alguna idea de por qué el '' flotante '' de 32 bits se considera más ancho que el 'largo' de 64 bits? –

+2

@PeterLawrey: Un flotador tiene un rango de -3.4e + 38 a 3.4e + 38 (aprox). Un largo tiene un rango de -9.2e18 a -9.2e18. Como el flotador tiene un rango mayor, es más ancho. –

+0

Eso es probablemente el pensamiento. El problema que tengo es cuando pasa un 'largo' a un método que toma un' float' por accidente, puede convertir 64 bits de precisión en 24 bits: P –

Cuestiones relacionadas