Подтвердить что ты не робот

Float/int неявное преобразование

Я делаю умножение и деление float и int, и я забываю о неявных правилах преобразования (и слова в вопросе кажутся слишком расплывчатыми для google быстрее, чем спрашивать здесь).

Если у меня есть два int s, но я хочу делать деление с плавающей запятой, нужно ли мне только один или оба операнда? Как насчет умножения - если я умножаю a float и a int, это ответ a float?

4b9b3361

Ответ 1

Вы не можете назначить результат int из деления a float на int или наоборот.

Итак, ответы:

Если у меня есть два int s, но я хочу сделать разделение с плавающей запятой...?

Достаточно одного нажатия.

Если я умножаю a float и a int, то ответ a float?

Да, это так.


float f = 1000f;
int i = 3; 

f = i; // Ok
i = f; // Error

f = i/f; //Ok 0.003
f = f/i; //Ok 333.3333(3)

i = i/f; //Error
i = f/i; //Error

Ответ 2

Чтобы продемонстрировать:

 int i1 = 5;
 float f = 0.5f;
 int i2 = 2;
 System.out.println(i1 * f);
 System.out.println(i1 / i2);
 System.out.println(((float) i1) / i2);

Результат:

2.5
2 
2.5

Ответ 3

Для выполнения любой арифметики с плавающей запятой с целыми числами вам необходимо преобразовать (читать: cast) по крайней мере один из операндов в тип float.

Ответ 4

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

(Источник: Спецификации языка Java - 4.2.4)

если я умножаю float и int, является ли ответ float?

System.out.println(((Object)(1f*1)).getClass());//class java.lang.Float

(Если вы используете DrJava, вы можете просто ввести ((Object) (1f * 1)). getClass() на панели взаимодействия. Там есть плагин для DrJava для Eclipse.)

Ответ 5

Простой ответ заключается в том, что Java будет автоматически выполнять расширенные преобразования, но не сужать конверсии. Так, например, int- > float является автоматическим, но float- > int требует литье.

Ответ 6

Java ранжирует примитивные типы в порядке int < long < float < double. Если оператор используется с разными примитивными типами, тип, который появляется перед другим в приведенном выше списке, будет неявно преобразован в другой, без какой-либо диагностики компилятора, даже в тех случаях, когда это приведет к потере точности. Например, 16777217-1.0f даст 16777215.0f (на один меньше правильного значения). Во многих случаях операции между float и a int вне диапазона +/- 16777216 должны выполняться путем отбрасывания int до double, выполнения операции, а затем - при необходимости - литья результат float. Я считаю, что требование двойного литья раздражает, но правила typecasting в Java требуют, чтобы один из них использовал раздражающее двойное литье или терпел потерю точности.