Float/int неявное преобразование
Я делаю умножение и деление float
и int
, и я забываю о неявных правилах преобразования (и слова в вопросе кажутся слишком расплывчатыми для google быстрее, чем спрашивать здесь).
Если у меня есть два int
s, но я хочу делать деление с плавающей запятой, нужно ли мне только один или оба операнда? Как насчет умножения - если я умножаю a float
и a int
, это ответ a float
?
Ответы
Ответ 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 требуют, чтобы один из них использовал раздражающее двойное литье или терпел потерю точности.