6 ответов:
float f = 99.32f ;что это
floatлитерал, что означает, что переменной с плавающей точкой присваивается значениеfloatзначение напрямую.float f = (float) 99.32 ;что это
floatпеременная, которой присвоено значениеdoubleзначение, которое приводится кfloatперед назначением.
разница может быть оптимизирована, но в первом случае у вас есть двойной литерал, который является типом, приведенным к float, в то время как у вас есть литерал float во втором случае.
Если не оптимизирован прочь вы получите typecast в коде во втором примере.
есть случаи, когда результат может (в зависимости от режима округления) будет немного отличаться. Если ваш номер не может быть точно представлен, вы в первом случае получите округление дважды-сначала когда вы округляете десятичное представление до двойного, а затем, когда вы округляете его до float, в первом случае вы округляете десятичное представление непосредственно до float.
В первом случае без приведения
99.32интерпретируется как double, а не как float.двойной литерал приводится к плаванию.
во втором случае у вас есть суффикс
fчтобы убедиться, что компилятор обрабатывает99.32как поплавок.
в строке
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 f = 99.32;вы даже можете сделать :
float f = (double) 10.5f;и правая сторона все еще неявно преобразуется в поплавок.
обратите внимание, что большинство современных компиляторов оптимизируют их, поэтому представление поплавков обычно зависит от стиля и предпочтений. просто будьте последовательны.
Comments