В чем разница между
float f = (float) 99.32 ;
и
float f = 99.32f ;
Оба из них скомпилированы и успешно выполнены.
В чем разница между
float f = (float) 99.32 ;
и
float f = 99.32f ;
Оба из них скомпилированы и успешно выполнены.
float f = 99.32f ;
Это литерал float, что означает, что переменная float присваивается непосредственно значением float.
float f = (float) 99.32 ;
Это переменная float, которой присваивается значение double, которое передается в float перед назначением.
Разница может быть оптимизирована, но в первом случае у вас есть двойной литерал, который является типом, отлитым от float, в то время как во втором случае вы имеете плавающий литерал.
Если вы не оптимизированы, вы получите код типа в коде во втором примере.
Однако есть угловые случаи, когда результат может (в зависимости от режима округления) быть немного иным. Если ваш номер не может быть точно представлен, вы в первом случае получите округление дважды - сначала, когда вы округлите десятичное представление до двойника, а затем, когда вы округлите его до плавающего, в то время как в первом случае вы округлите десятичное представление непосредственно к плавающей точке.
В первом случае без литой 99.32 интерпретируется как double не как float.
Двойной литерал выполняется для плавания.
Во втором случае у вас есть суффикс f, чтобы убедиться, что компилятор рассматривает 99.32 как float.
В строке float f = (float) 99.32; по умолчанию используется литерал 99.32 как тип double, а затем передается в float.
В строке float f = 99.32f ; литерал создается как тип float из-за конечного f в 99.32f и не требуется никакого литья типа.
Последний будет аналогичен написанию double f = 99.32;, поскольку у вас будет тип double, назначаемый непосредственно переменной типа соответствия.
Литералы с плавающей точкой без суффикса по умолчанию имеют тип double.
Таким образом, указав float f = (float) 99.32;, вы сначала произнесите  явно литерал 99.32, который имеет тип double, на float, а затем назначьте его переменной f.
Указание float f = 99.32; делает то же самое, но в этом случае преобразование  между типами выполняется неявно.
Если вы хотите избежать неявного преобразования, вы должны использовать суффикс f, чтобы определить ваш литерал (т.е. float f = 99.32f;)
Разница в том, что литерал 99.32 имеет тип double, а литерал 99.32f имеет тип float.
Первый оператор присваивает float-литералу переменной float. Ничего особенного.
Второй оператор выдает двойной литерал для float и присваивает результат переменной float.
Что касается стандарта, вы можете назначить двойной литерал для переменной float, не указывая явно ее самостоятельно. В этом случае происходит неявное литье. Например.
float f = 99.32;
Вы даже можете сделать:
float f = (double) 10.5f;
а правая сторона все еще неявно преобразуется в float.
Обратите внимание, что большинство современных компиляторов оптимизируют их, поэтому представление floats обычно имеет значение стиля и предпочтения. Просто быть последовательным.