Целочисленное деление: Как Вы производите двойное?

Для этого блока кода:

int num = 5;
int denom = 7;
double d = num / denom;

значение d 0.0. Это может быть вынуждено работать путем кастинга:

double d = ((double) num) / denom;

Но есть ли другой способ получить корректное double результат? Мне не нравится бросать примитивы, кто знает то, что может произойти.

232
задан Tom 6 April 2016 в 23:13
поделиться

3 ответа

double num = 5;

Это позволяет избежать каста. Но вы обнаружите, что преобразования приведения в действие четко определены. Вам не нужно гадать, просто проверьте JLS . int в double - это расширяющееся преобразование. Из §5.1.2 :

Расширяющиеся примитивные преобразования не терять информацию об общем величина числового значения.

[...]

Преобразование типа int или long плавать, или длинное значение, чтобы двойной, может привести к потере точность - то есть результат может потерять некоторые из наименее значимых битов Значение. В этом случае полученный значение с плавающей запятой будет правильно округленная версия целочисленное значение, используя IEEE 754 режим округления до ближайшего (§4.2.4) .

5 можно выразить в точности как двойное.

148
ответ дан 23 November 2019 в 03:36
поделиться

Что не так с преобразованием примитивов?

Если вы по какой-то причине не хотите преобразовывать, вы можете сделать

double d = num * 1.0 / denom;
94
ответ дан 23 November 2019 в 03:36
поделиться

Я не люблю кастовать примитивов, кто знает, что может случиться.

Почему у вас иррациональный страх перед кастингом примитивов? Ничего плохого не произойдет, если вы приведете int к double . Если вы просто не знаете, как это работает, поищите его в Спецификации языка Java . Преобразование int в double является расширяющим примитивным преобразованием .

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

double d = num / (double) denom;
67
ответ дан 23 November 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: