リテラル(浮動小数点リテラルの既定型と f サフィックス)難易度 標準無料
次のコードのコンパイル結果として正しいものを選べ。
1 public class Q14 {
2 public static void main(String[] args) {
3 float f = 3.14;
4 System.out.println(f);
5 }
6 }
- Aコンパイルエラー(
3.14は既定でdoubleでありfloatへの暗黙変換は不可) - Bコンパイル成功・実行して
3.14と出力される - Cコンパイル成功。
byte b = 100;と同様に定数式なので暗黙にfloatへ変換される - Dコンパイルエラー(
floatという型自体が非推奨で使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
浮動小数点リテラル(
各誤答が違う理由f/F サフィックスの無いもの)は既定で double 型として解釈される。
double(64ビット)から float(32ビット)への代入は精度が落ちる縮小変換であり、
int→byte のような「定数式が範囲に収まれば無条件OK」という特例は浮動小数点には適用されない。
そのため 3.14(double)をキャストや f サフィックス無しで float 変数へ代入するとコンパイルエラーになる。
正しく書くには float f = 3.14f;(f サフィックスでリテラル自体を float にする)か、float f = (float) 3.14;(明示キャスト)のいずれかが必要。
- B
3.14はfサフィックスが無いためdouble型のリテラル。float変数へのキャスト無し代入は縮小変換としてコンパイルエラーになる。 - Cキャスト無しの縮小変換の特例は整数リテラルにのみ適用され、浮動小数点(
double→float)には適用されない。 - D
floatは現行のプリミティブ8種の1つとして正式にサポートされている。エラーの原因は型そのものではなく、リテラルとの型不一致。
ひっかけ: 「
byte b = 100; のように、範囲に収まる定数ならキャスト無しで縮小代入できる」というルールを浮動小数点にもそのまま当てはめてしまうのが罠。その特例は整数リテラルの定数式にのみ適用され、浮動小数点リテラル(double→float)には適用されない。コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q14.java:3: error: incompatible types: possible lossy conversion from double to float
float f = 3.14;
^
→ コンパイル不成立(実行に至らない)。公式ドキュメント・関連JLS SE11 §3.10.2 Floating-Point Literals↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)