2010-11-04 12 views
20

Estoy haciendo la multiplicación y división de float sy int sy olvidé las reglas de conversión implícitas (y las palabras en la pregunta parecen demasiado vagas para google más rápido que preguntar aquí).float/int conversión implícita

Si tengo dos int s, pero quiero hacer la división de coma flotante, ¿solo necesito lanzar uno o ambos operandos? ¿Qué tal para la multiplicación? Si multiplico un float y un int, ¿la respuesta es float?

+0

Por cierto, debería poder escribir un método Java de <10 líneas que pruebe esto por usted. –

+4

estuvo de acuerdo, pero no tengo un arnés de prueba rápido y sucio para esto porque lo único que hago con Java es crear proyectos de Android en Eclipse, así que ni siquiera sabría (sin buscarlo) cómo crear un simple aplicación de línea de cmd en Java. Más rápido para preguntar aquí y obtener una respuesta en literalmente segundos mientras continúo trabajando. =) – Rich

+2

Pero ahora todos en la tierra no tienen que probar esto. –

Respuesta

31

No se puede asignar a un resultado int de la división de un float por un int o viceversa.

Así que las respuestas son:

Si tengo dos int s, pero quiero hacer una división en coma flotante ...?

Un lanzamiento es suficiente.

Si multiplico un float y un int, es la respuesta de un float?

Sí, lo es.


float f = 1000f; 
int i = 3; 

f = i; // Ok 
i = f; // Error 

f = i/f; //Ok 0.003 
f = f/i; //Ok 333.3333(3) 

i = i/f; //Error 
i = f/i; //Error 
7

Para realizar cualquier tipo de aritmética de punto flotante con números enteros, debe convertir (leer: transmitir) al menos uno de los operandos a un tipo float.

+4

+1, por concisión – Bozho

10

Para demostrar:

int i1 = 5; 
float f = 0.5f; 
int i2 = 2; 
System.out.println(i1 * f); 
System.out.println(i1/i2); 
System.out.println(((float) i1)/i2); 

Resultado:

2.5 
2 
2.5 
+0

Agregué corchetes adicionales para borrar eso, gracias – Bozho

7

Si al menos uno de los operandos a un operador binario es de tipo de punto flotante , entonces la operación es una operación de punto flotante, incluso si el otro es integral .

(Fuente: Java language specifications - 4.2.4)

si multiplico un flotador y un int, es la respuesta de un flotador?

System.out.println(((Object)(1f*1)).getClass());//class java.lang.Float 

(Si utiliza DrJava, sólo tiene que escribir ((Objeto) (1f * 1)). GetClass() en el panel de interacciones. Hay un plugin para DrJava para Eclipse también.)

5

La respuesta simple es que Java realizará conversiones de ampliación automáticamente pero no reducirá las conversiones. Entonces, por ejemplo, int-> float es automático, pero float-> int requiere un molde.

0

Java clasifica los tipos primitivos en el orden int < long < float < double.Si un operador se utiliza con diferentes tipos primitivos, el tipo que aparece antes que el otro en la lista anterior se convertirá implícitamente en el otro, sin ningún diagnóstico de compilación, incluso en los casos en que esto causaría una pérdida de precisión. Por ejemplo, 16777217-1.0f arrojará 16777215.0f (uno menos que el valor correcto). En muchos casos, las operaciones entre float y int fuera del rango +/- 16777216 deben realizarse fundiendo int en double, realizando la operación y luego, si es necesario, lanzando el resultado a float. Encuentro molesto el requisito para el doble lanzamiento, pero las reglas de encasillado en Java requieren que uno use el molesto doble molde o que pierda la precisión.

Cuestiones relacionadas