Для этого блока кода:
int num = 5;
int denom = 7;
double d = num / denom;
значение d
0.0
. Это может быть вынуждено работать путем кастинга:
double d = ((double) num) / denom;
Но есть ли другой способ получить корректное double
результат? Мне не нравится бросать примитивы, кто знает то, что может произойти.
double num = 5;
Это позволяет избежать каста. Но вы обнаружите, что преобразования приведения в действие четко определены. Вам не нужно гадать, просто проверьте JLS . int в double - это расширяющееся преобразование. Из §5.1.2 :
Расширяющиеся примитивные преобразования не терять информацию об общем величина числового значения.
[...]
Преобразование типа int или long плавать, или длинное значение, чтобы двойной, может привести к потере точность - то есть результат может потерять некоторые из наименее значимых битов Значение. В этом случае полученный значение с плавающей запятой будет правильно округленная версия целочисленное значение, используя IEEE 754 режим округления до ближайшего (§4.2.4) .
5 можно выразить в точности как двойное.
Что не так с преобразованием примитивов?
Если вы по какой-то причине не хотите преобразовывать, вы можете сделать
double d = num * 1.0 / denom;
Я не люблю кастовать примитивов, кто знает, что может случиться.
Почему у вас иррациональный страх перед кастингом примитивов? Ничего плохого не произойдет, если вы приведете int
к double
. Если вы просто не знаете, как это работает, поищите его в Спецификации языка Java . Преобразование int
в double
является расширяющим примитивным преобразованием .
Вы можете избавиться от лишней пары круглых скобок, приведя знаменатель вместо числителя:
double d = num / (double) denom;