Unexpected result in long/int division

37,856

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.

Solution 4

The resulting type of a long and int devision will be a long, which can't hold decimals.

you want to cast it to a double before you assign it

Solution 5

millis/consta is an integer division, which results in 0. the casting in the line:

double res = millis/consta;

is done on the result:

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

What you need to do is to cast one of the operands:

double res = (double)millis/consta;
Share:
37,856
alex
Author by

alex

.

Updated on September 07, 2020

Comments

  • alex
    alex over 3 years

    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?

  • Shark
    Shark over 11 years
    This is the best and proper answer.