2012-09-07 30 views
11

Tengo valores como esta:resultado inesperado en el tiempo/división int

long millis = 11400000; 
int consta = 86400000; 
double res = millis/consta; 

La pregunta es: ¿por qué es igual res0.0 (en lugar de aprox 0.131944)? Se almacena en double por lo que no debe haber redondeo, ¿verdad?

+1

Entero División ... – Mysticial

Respuesta

18

Cuando se utiliza un operador binario, ambos argumentos deben ser de un mismo tipo y el resultado será en su tipo también. Cuando quiera dividir (int)/(long) se convierte en (long)/(long) y el resultado es (long). debe hacerlo (double)/(long) o (int)/(double) para obtener un doble resultado.Desde doble es mayor que int y largo, int y largo se convirtió en doble en (double)/(long) y (int)/(double)

17

Dado que está dividiendo un long por un int obtendrá un long resultados. Lo que está haciendo es efectivamente

double res = (double) (millis/consta); 

como millis/consta es 0, cuando se convierte a double es 0.0

intente lo siguiente para dividir un doble de un int y obtener un resultado doble.

double res = (double) millis/consta; 

que es el mismo que

double res = ((double) millis)/((double) consta)); 
1

millis/consta es una división de enteros, lo que resulta en 0. la calidad en la línea:

double res = millis/consta; 

se realiza en el resultado:

double res = (double)(millis/consta); 

Lo que hay que hacer es lanzar uno de los operandos:

double res = (double)millis/consta; 
3

Usted está haciendo long división (int se lanza a largo) para que obtenga long valores, que son enteros (por lo tanto, 0)

Debe hacer

double res = (double) millis/consta; 

Una vez que uno de los valores es fundido a doblar, y el otro es demasiado fundido por lo que la operación utiliza el mismo tipo en ambos operadores.

+0

Esta es la mejor y la mejor respuesta. – Shark

0

Cuando esto sucede, desciende automáticamente a int para realizar la operación. Tu lo escribes como:

long millis = 11400000; 
int consta = 86400000; 
double res = ((double)millis)/((double)consta); 

Y funcionará.

1

El tipo resultante de una visión larga e int será larga, que no puede contener decimales.

que quieren echarlo a un doble antes de asignarlo

0

Esto es porque largo: El tipo de datos a largo es un 64-bit entero con signo de complemento a dos. int: El tipo de datos int es un entero de complemento de dos firmado de 32 bits.

See Primitive type Significa que ambos son enteros. Dado que dividimos largo por entero, el resultado es largo 0. Pero asigna este valor a res (doble) e imprime. Entonces se muestra el resultado 0.0.

long millis = 11400000; 
int consta = 86400000; 

System.out.println("millis/consta = " + millis/consta); // print 0 

double res = millis/consta; 
System.out.println("Res " + res); // print 0.0 
Cuestiones relacionadas