Unexpected result in long/int division

I have values like this:

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

The question is: why res equals 0.0 (instead of ca. 0.131944)? It's stored in double so there should be no rounding right?


Solution 1:

When you are using a binary operator, both arguments should be of a same type and the result will be in their type too. When you want to divide (int)/(long) it turns into (long)/(long) and the result is (long). you shouldmake it (double)/(long) or (int)/(double) to get a double result. Since double is greater that int and long, int and long will be turned into double in (double)/(long) and (int)/(double)

Solution 2:

Because you are dividing a long by an int you get an long results. What you are effectively doing is

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

as millis/consta is 0, when cast to double is 0.0

Try the following to divide a double by an int and get a double result.

double res = (double) millis/consta;

which is the same as

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

Solution 3:

You are doing longdivision (int gets cast to long) so you get long values, which are integers (so, 0)

You should do

  double res = (double) millis / consta;

Once one of the values is casted to double, the other is too casted so the operation uses the same type in both operators.