2012-08-26 25 views
6

Cuando hago algo como esto¿Cómo funcionan las ecuaciones matemáticas en Java?

int test = 5 + 3 * (4 - 1)/2; 

me sale 9. Yo sospechaba que esto era debido int redondea hacia abajo. Sin embargo, cuando hago esto

float test = 5 + 3 * (4 - 1)/2; 

también consigo 9. Sin embargo, cuando hago esto

float test1 = 5; 
float test2 = 4.5; 
float test = test1 + test2; 

la prueba que da salida a 9,5. ¿Podría alguien explicar la lógica detrás de esto? ¿Por qué no obtengo 9.5 en el segundo ejemplo? Gracias.

+0

La división de enteros se realiza de esta manera en muchos idiomas, no solo en Java. Todos los lenguajes C actúan de esta manera: C, C++, C#, Java, JavaScript. – duffymo

Respuesta

16

En el segundo ejemplo, aunque estás asignar el resultado a una variable de tipo float, el cálculo en sí se sigue realizando exactamente la misma forma que el primer ejemplo. Java no mira el tipo de variable de destino para determinar cómo calcular el lado derecho. En particular, la subexpresión 3 * (4 - 1)/2 da como resultado 4.

Para solucionar este problema, puede utilizar literales de punto flotante en lugar de todos los números enteros:

float test = 5 + 3 * (4 - 1)/2.0f; 

Usando 2.0f desencadenantes cálculos de punto flotante para la expresión aritmética.

+0

Eso tiene sentido, pero parece que será un poco difícil hacer un seguimiento. Gracias. – glcohen

+0

@ user1626448: La mayoría de las veces, harás cálculos con una o más variables existentes, que ya tienen un tipo de 'float' o' double' o lo que sea. En ese caso, no tienes que preocuparte por esto. –

3

Aunque usted representa el resultado de 5 + 3 * (4 - 1)/2 en un flotador, la evaluación propiamente dicha se realiza con la precisión de un número entero, lo que significa que la división de 9/2 retornos 4 en lugar de los 4,5 que recibiría si se evaluaron como flotadores.

2

Las expresiones tienen su propio tipo. Así que comience con:

5 + 3 * (4 - 1)/2 

Cada valor tiene su propio tipo. Este tipo pasa a ser int, así que esto es lo mismo que:

((int)5) + ((int)3) * (((int)4) - ((int)1))/((int)2) 

Por lo que es más claro que estamos tratando con enteros. Solo después de que esto se evalúa como 9, se asigna a un flotante.

0

La respuesta corta es que los tipos enteros operan en aritmética modular, con el módulo 1, y descartan el resto.

Desde que lances test como un entero, la aritmética modular se emplea con el módulo 1 (por ejemplo 9,5 mod 1), prueba int = 5 + 3 * (4 - 1)/2;

Con un flotador de 32 o 64 bits esto daría 9.5; sin embargo, como ha emitido test como int, el resto se descarta y el valor al que hace referencia test es 9.

Cuestiones relacionadas