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?
This is because long: The long data type is a 64-bit signed two's complement integer. int: The int data type is a 32-bit signed two's complement integer. See Primitive type It means both are integer. Since we divide long by integer, result is long 0.
When dividing an integer by an integer, the answer will be an integer (not rounded). When an operation involves two types (as the mixed division shown above), the smaller type is converted to the larger type. In the case above, the integer 5 was converted to a double type before the division occurred.
Yes, you can add a long and an int just fine, and you'll end up with a long . The int undergoes a widening primitive conversion, as described in the Java Language Specification, specifically JLS8, §5.1. 2 .
When dividing two numbers of the same type (integers, doubles, etc.) the result will always be of the same type (so 'int/int' will always result in int). In this case you have double var = integer result which casts the integer result to a double after the calculation in which case the fractional data is already lost.
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)
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));
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.
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;
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With