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