AI作成・独立検証済(有資格者監修なし)1Z0-815 対応
リテラル(浮動小数点リテラルの既定型と f サフィックス)難易度 標準無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q14 {
2      public static void main(String[] args) {
3          float f = 3.14;
4          System.out.println(f);
5      }
6  }
  1. Aコンパイルエラー(3.14 は既定で double であり float への暗黙変換は不可)
  2. Bコンパイル成功・実行して 3.14 と出力される
  3. Cコンパイル成功。byte b = 100; と同様に定数式なので暗黙に float へ変換される
  4. Dコンパイルエラー(float という型自体が非推奨で使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

浮動小数点リテラル(fF サフィックスの無いもの)は既定で doubleとして解釈される。

double(64ビット)から float(32ビット)への代入は精度が落ちる縮小変換であり、 intbyte のような「定数式が範囲に収まれば無条件OK」という特例は浮動小数点には適用されない。 そのため 3.14double)をキャストや f サフィックス無しで float 変数へ代入するとコンパイルエラーになる。

正しく書くには float f = 3.14f;f サフィックスでリテラル自体を float にする)か、float f = (float) 3.14;(明示キャスト)のいずれかが必要。

各誤答が違う理由
  • B3.14f サフィックスが無いため double 型のリテラル。float 変数へのキャスト無し代入は縮小変換としてコンパイルエラーになる。
  • Cキャスト無しの縮小変換の特例は整数リテラルにのみ適用され、浮動小数点(double→float)には適用されない。
  • Dfloat は現行のプリミティブ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が作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
この分野をもっと解いて、得点源に
データ型 を含む問題を分野別に演習できます。
演習する →