初心者向けにかみ砕いて、例題(実行例付き)と演習問題(解答・解説付き)までまとめます。読みやすさ重視で段階を追って説明しますね。
浮動小数点リテラルは、プログラム中に書く「実数(小数)」そのもののことです。Javaでは主に double(標準) と float(精度が低い・サイズが小さい)の2種類の実数型があります。ソースコードに書いた 3.14 や 1.2e3 が「浮動小数点リテラル」です。
1. 基本ルール(わかりやすく)
- 小数点を書けば実数
double a = 3.14; // 3.14 は double のリテラル(型指定がなければ double) - 指数(科学的表記)で大きい/小さい数を表せる
eまたはEを使う。仮数部 e 指数の形。- 例:
5.23e3は5.23 × 10^3 = 5230。7.5e-2は7.5 × 10^-2 = 0.075。
double b = 5.23e3; double c = 7.5e-2; floatを使いたいときは末尾にf(小文字か大文字可)float x = 3.14;はエラー(暗黙の double → float ダウンキャストは不可)- 正しくは
float x = 3.14f;
float f = 3.14f; // OK double d = 3.14; // 通常はこちらを使う- 符号(+,-)はリテラルの前に置けるが、実際は「単項演算子」
double x = -2.5; // - は単項マイナス、値は -2.5 - ダブルクオートで囲むと文字列
"3.14"は文字列なので計算できない(数に変換する必要あり)。
String s = "3.14"; - 数字の中で
_(アンダースコア)が使える(読みやすくするため、Java7以降)double big = 1_000_000.123_456;
2. 実行して試せるサンプル(そのまま保存して javac/jvm で実行できます)
class FloatLiteralDemo {
public static void main(String[] args) {
double d1 = 3.14;
double d2 = 5.23e3; // 5230.0
double d3 = 7.5e-2; // 0.075
float f1 = 3.14f; // float は末尾に f が必要
double big = 1_000_000.123_456; // アンダースコア利用例
System.out.println(d1); // 3.14
System.out.println(d2); // 5230.0
System.out.println(d3); // 0.075
System.out.println(f1); // 3.14 (ただし内部精度は double より低い)
System.out.println(big); // 1000000.123456
System.out.println("0.1 + 0.2 = " + (0.1 + 0.2)); // 注意:誤差の例
}
}
Java最後の 0.1 + 0.2 は多くの言語と同じく 0.30000000000000004 のような表示になることがあり、「小数の丸め誤差」が見える良い例です。
3. 注意点(初心者が間違いやすいところ)
3.14と"3.14"は別物- 前者は数、後者は文字列。計算で使いたければ前者を使うか、文字列を解析して数に変換する必要があります。
floatとdoubleの違いdoubleは 64 ビット、floatは 32 ビット。doubleのほうが精度(有効桁数)が高い。floatにリテラルを代入するときは必ずfを付ける(float f = 3.14;はコンパイルエラー)。
- 浮動小数点は二進数で内部表現される → 表現できない小数がある
- 0.1 や 0.2 は二進で正確に表せないため、計算でわずかな誤差が出ます。
- 金額など「正確さが必要」な場合は
BigDecimalを使います(doubleは金融計算に不向き)。
- 比較の罠
- 浮動小数点同士を
==で比較すると誤差のため期待通りにtrueにならないことがある。差の絶対値が小さいかで判定するのが一般的。
Math.abs(a - b) < 1e-9 - 浮動小数点同士を
- 指数表記で符号を忘れない
1.2e3と1.2e-3は全く別。前者は 1200、後者は 0.0012。
- 非常に大きい/小さい値は
Infinityや0.0に(オーバーフロー/アンダーフロー)- 例:
1e308を超えるとInfinityになることがある。
- 例:
4. 具体的な例と解説(ステップ別)
例1:小数の足し算
double a = 1.5;
double b = 2.25;
System.out.println(a + b); // 3.75
Java→ 普通に足せますが、表示や比較に注意。
例2:指数表記
double x = 2.5e2; // 2.5 × 10^2 = 250.0
double y = 3.1E-3; // 3.1 × 10^-3 = 0.0031
Java例3:float の使い方
float f = 0.1f; // f をつけないとコンパイルエラー
double d = 0.1; // double のリテラル
Java例4:誤差が出る例(重要)
System.out.println(0.1 + 0.2); // 0.30000000000000004 のように出る
Java→ 浮動小数点は二進で扱うため、一般に小数は正確に表現できないことがある。
練習問題(初心者向け 5問) — 解答・解説付き
問1
次のうち、Java の double リテラルとして正しいものはどれ?
A: "3.5"
B: 3.5
C: 3,5
D: 3.5f
答え:B と D(D は float のリテラル)
- A は文字列、C はカンマ区切りで Java の数ではない。
3.5fはfloatリテラルだが数値リテラルである点は正しい(ただし型は float)。
問2
次を評価したときの出力は?
System.out.println(5.23e3);
Java答え: 5230.0
解説: 5.23e3 = 5.23 × 10^3 = 5230。Java の println は小数点以下を表示するので 5230.0 になる。
問3
次のコードはコンパイルしますか?もししないならどう直す?
float f = 3.14;
Java答え:コンパイルエラーになる。修正例:float f = 3.14f; または double d = 3.14;
解説: 3.14 は double リテラルなので、float へは明示的なサフィックス f が必要。
問4
次のうち 0.1 + 0.2 == 0.3 が true になるか?(Javaで評価)
答え:多くの場合 false になる
解説: 浮動小数点の丸め誤差のため、0.1 + 0.2 は 0.30000000000000004 のようになり == 0.3 と一致しない。正しく比較するには許容誤差を使う:
Math.abs((0.1 + 0.2) - 0.3) < 1e-9
問5
double big = 1_000_000.123_456; のように _ を入れて良いか?また何のため?
答え:入れて良い。読みやすさを上げるために桁区切りとして使う(Java7以降)。実行時の値は _ を除いたものと同じ。
まとめ(初心者がまず覚えるべき 3 つ)
- リテラルは
3.14のように書く。文字列"3.14"と間違えない。 floatを使うときは末尾にfを付ける (3.14f)。付けないとdouble。- 浮動小数点は丸め誤差がある → 金額など正確さが必要な場合は
BigDecimalを使う。
