Unexpected result in long/int division
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 long
division (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;
Comments
-
alex over 3 years
I have values like this:
long millis = 11400000; int consta = 86400000; double res = millis/consta;
The question is: why
res
equals0.0
(instead of ca.0.131944
)? It's stored indouble
so there should be no rounding right? -
Shark over 11 yearsThis is the best and proper answer.