Неожиданный результат в длинном/целом делении

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

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

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


person alex    schedule 07.09.2012    source источник


Ответы (7)


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

person Kamran Amini    schedule 07.09.2012

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

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

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

  double res = (double) millis / consta;

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

person SJuan76    schedule 07.09.2012
comment
Это лучший и правильный ответ. - person Shark; 07.09.2012

millis/consta — это целочисленное деление, в результате которого получается 0. кастинг в линию:

double res = millis/consta;

делается по результату:

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

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

double res = (double)millis/consta;
person MByD    schedule 07.09.2012

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

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

person Minion91    schedule 07.09.2012

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

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

И это сработает.

person bjedrzejewski    schedule 07.09.2012

Это связано с тем, что 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
person swemon    schedule 07.09.2012