Resultado inesperado en la división larga / int

Tengo valores como este:

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

La pregunta es: ¿por qué res equivale a 0.0 (en lugar de 0.131944 )? Se almacena en double por lo que no debería haber redondeo, ¿verdad?

Cuando usa un operador binario, ambos argumentos deben ser del mismo tipo y el resultado también estará en su tipo. Cuando quiere dividir (int)/(long) se convierte en (long)/(long) y el resultado es (long) . debe hacerla (double)/(long) o (int)/(double) para obtener un doble resultado. Como double es mayor que int y long, int y long se convertirán en double in (double)/(long) y (int)/(double)

Debido a que estás dividiendo un long por un int , obtienes resultados long . Lo que estás haciendo efectivamente es

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

como millis/consta es 0 , cuando se lanza al double es 0.0

Intenta lo siguiente para dividir un doble por un int y obtener un doble resultado.

 double res = (double) millis/consta; 

que es lo mismo que

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

Estás haciendo long división long (int se lanza a largo) para que obtengas valores long , que son enteros (entonces, 0)

Deberías hacer

  double res = (double) millis / consta; 

Una vez que uno de los valores se convierte en el doble, el otro está demasiado fundido, por lo que la operación utiliza el mismo tipo en ambos operadores.

millis/consta es una división entera, que resulta en 0 . el casting en la línea:

 double res = millis/consta; 

se hace en el resultado:

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

Lo que debes hacer es lanzar uno de los operandos:

 double res = (double)millis/consta; 

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

quieres lanzarlo a un doble antes de asignarlo

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

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

Y funcionará.

Esto es porque siempre: el tipo de datos largos es un entero de complemento de dos firmado de 64 bits. int: el tipo de datos int es un entero de complemento de dos firmado de 32 bits.

Ver tipo primitivo Significa que ambos son enteros. Dado que dividimos largo por entero, el resultado es largo 0. Pero usted asigna este valor al valor 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