Неожиданный результат в сегменте long/int

У меня есть такие значения:

long millis = 11400000;
int consta = 86400000;
double res = millis/consta;

Возникает вопрос: почему res равно 0.0 (вместо c 0.131944)? Он хранится в double, поэтому не должно быть округления вправо?

Ответ 1

Когда вы используете двоичный оператор, оба аргумента должны быть одного типа, и результат будет также в их типе. Когда вы хотите разделить (int)/(long), он превращается в (long)/(long), а результат - (long). вы должны сделать это (double)/(long) или (int)/(double), чтобы получить двойной результат. Поскольку double больше int и long, int и long будут переведены в double в (double)/(long) и (int)/(double)

Ответ 2

Поскольку вы делите 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));

Ответ 3

Вы выполняете разделение long (int получает отбрасывание до конца), поэтому вы получаете значения long, которые являются целыми числами (так, 0)

Вы должны сделать

  double res = (double) millis / consta;

Как только одно из значений выбрано для двойного, другое слишком выполнено, поэтому операция использует один и тот же тип в обоих операциях.

Ответ 4

millis/consta - целочисленное деление, что приводит к 0. литье в строке:

double res = millis/consta;

выполняется по результату:

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

Что вам нужно сделать, это сделать один из операндов:

double res = (double)millis/consta;

Ответ 5

Результирующий тип длинного и int-деления будет длинным, который не может содержать десятичные числа.

вы хотите передать его в двойное, прежде чем назначать его

Ответ 6

Когда это происходит, он автоматически отключает int для выполнения операции. Твое письмо написано так:

long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);

И он будет работать.

Ответ 7

Это потому, что 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