Причина, по которой float temp = b/a;
дает 0, а float temp = (float)b/a;
дает 0,5, заключается в том, что компилятор определяет тип вывода операции деления на основе типов операндов, а не типа хранения назначения. Проще говоря:
int / int = int
float / int = float
int / float = float
float / float = float
Итак, когда вы делаете float temp = b/a;
, вы делите целочисленное деление на b
и a
, а затем сохраняете полученное целое число (0 в вашем примере) в переменную типа float
. По сути, к тому времени, когда значение преобразуется в число с плавающей запятой, вы уже потеряли искомую информацию (предполагая, что хотите выполнить деление с плавающей запятой), и преобразование не вернет ее.
Чтобы получить желаемый результат (опять же, предполагая, что вы хотите выполнить деление с плавающей запятой), вам необходимо привести хотя бы один из операндов к float
до того, как вы разделите .