У меня есть такие значения:
long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
Вопрос: почему res
равно 0.0
(вместо прибл. 0.131944
)? Он хранится в double
, поэтому округления быть не должно, верно?
У меня есть такие значения:
long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
Вопрос: почему res
равно 0.0
(вместо прибл. 0.131944
)? Он хранится в double
, поэтому округления быть не должно, верно?
Когда вы используете бинарный оператор, оба аргумента должны быть одного типа, и результат тоже будет того же типа. Когда вы хотите разделить (int)/(long)
, оно превращается в (long)/(long)
и в результате получается (long)
. вы должны сделать это (double)/(long)
или (int)/(double)
, чтобы получить двойной результат. Поскольку double больше, чем int и long, int и long будут преобразованы в double в (double)/(long)
и (int)/(double)
.
Поскольку вы делите long
на int
, вы получаете результат long
. То, что вы эффективно делаете,
double res = (double) (millis/consta);
так как millis/consta
равно 0
, при преобразовании в double
будет 0.0
Попробуйте следующее, чтобы разделить double на int и получить двойной результат.
double res = (double) millis/consta;
что то же самое, что
double res = ((double) millis)/((double) consta));
Вы выполняете long
division (int получает значение long), поэтому вы получаете значения long
, которые являются целыми числами (таким образом, 0)
Ты должен сделать
double res = (double) millis / consta;
Как только одно из значений приводится к типу double, другое становится слишком большим, поэтому операция использует один и тот же тип в обоих операторах.
millis/consta
— это целочисленное деление, в результате которого получается 0
. кастинг в линию:
double res = millis/consta;
делается по результату:
double res = (double)(millis/consta);
Что вам нужно сделать, так это привести один из операндов:
double res = (double)millis/consta;
Результирующий тип деления long и int будет типом long, который не может содержать десятичные дроби.
вы хотите привести его к двойному значению, прежде чем назначать его
Когда это происходит, он автоматически преобразуется в int для выполнения операции. Ты пишешь так:
long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);
И это сработает.
Это связано с тем, что long: тип данных long представляет собой 64-битное целое число в дополнении до двух со знаком. int: тип данных int представляет собой 32-разрядное целое число в дополнении до двух со знаком.
См. Примитивный тип Это означает, что оба являются целыми числами. Поскольку мы делим long на целое число, результатом будет long 0. Но вы присваиваете это значение значению res(double) и печатаете его. Таким образом, отображается результат 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