неявное преобразование float / int - PullRequest
21 голосов
/ 04 ноября 2010

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

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

Ответы [ 6 ]

33 голосов
/ 04 ноября 2010

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

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

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

Один бросокдостаточно.

Если я умножу float и int, будет ли ответ 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
11 голосов
/ 04 ноября 2010

Для демонстрации:

 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
7 голосов
/ 04 ноября 2010

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

(Источник: Спецификации языка 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.)

7 голосов
/ 04 ноября 2010

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

5 голосов
/ 05 ноября 2010

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

0 голосов
/ 08 августа 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...