Java | 浮動小数点リテラル(小数の書き方)

Java Java
スポンサーリンク

初心者向けにかみ砕いて、例題(実行例付き)と演習問題(解答・解説付き)までまとめます。読みやすさ重視で段階を追って説明しますね。

浮動小数点リテラルは、プログラム中に書く「実数(小数)」そのもののことです。Javaでは主に double(標準) と float(精度が低い・サイズが小さい)の2種類の実数型があります。ソースコードに書いた 3.141.2e3 が「浮動小数点リテラル」です。


1. 基本ルール(わかりやすく)

  1. 小数点を書けば実数 double a = 3.14; // 3.14 は double のリテラル(型指定がなければ double)
  2. 指数(科学的表記)で大きい/小さい数を表せる
    • e または E を使う。仮数部 e 指数 の形。
    • 例:5.23e35.23 × 10^3 = 52307.5e-27.5 × 10^-2 = 0.075
    double b = 5.23e3; double c = 7.5e-2;
  3. float を使いたいときは末尾に f(小文字か大文字可)
    • float x = 3.14; はエラー(暗黙の double → float ダウンキャストは不可)
    • 正しくは float x = 3.14f;
    float f = 3.14f; // OK double d = 3.14; // 通常はこちらを使う
  4. 符号(+,-)はリテラルの前に置けるが、実際は「単項演算子」 double x = -2.5; // - は単項マイナス、値は -2.5
  5. ダブルクオートで囲むと文字列
    • "3.14" は文字列なので計算できない(数に変換する必要あり)。
    String s = "3.14";
  6. 数字の中で _(アンダースコア)が使える(読みやすくするため、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. 注意点(初心者が間違いやすいところ)

  1. 3.14"3.14" は別物
    • 前者は数、後者は文字列。計算で使いたければ前者を使うか、文字列を解析して数に変換する必要があります。
  2. floatdouble の違い
    • double は 64 ビット、float は 32 ビット。double のほうが精度(有効桁数)が高い。
    • float にリテラルを代入するときは必ず f を付ける(float f = 3.14; はコンパイルエラー)。
  3. 浮動小数点は二進数で内部表現される → 表現できない小数がある
    • 0.1 や 0.2 は二進で正確に表せないため、計算でわずかな誤差が出ます。
    • 金額など「正確さが必要」な場合は BigDecimal を使います(double は金融計算に不向き)。
  4. 比較の罠
    • 浮動小数点同士を == で比較すると誤差のため期待通りに true にならないことがある。差の絶対値が小さいかで判定するのが一般的。
    Math.abs(a - b) < 1e-9
  5. 指数表記で符号を忘れない
    • 1.2e31.2e-3 は全く別。前者は 1200、後者は 0.0012。
  6. 非常に大きい/小さい値は Infinity0.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.5ffloat リテラルだが数値リテラルである点は正しい(ただし型は 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.3true になるか?(Javaで評価)
答え:多くの場合 false になる
解説: 浮動小数点の丸め誤差のため、0.1 + 0.20.30000000000000004 のようになり == 0.3 と一致しない。正しく比較するには許容誤差を使う:

Math.abs((0.1 + 0.2) - 0.3) < 1e-9

問5

double big = 1_000_000.123_456; のように _ を入れて良いか?また何のため?
答え:入れて良い。読みやすさを上げるために桁区切りとして使う(Java7以降)。実行時の値は _ を除いたものと同じ。


まとめ(初心者がまず覚えるべき 3 つ)

  1. リテラルは 3.14 のように書く。文字列 "3.14" と間違えない。
  2. float を使うときは末尾に f を付ける (3.14f)。付けないと double
  3. 浮動小数点は丸め誤差がある → 金額など正確さが必要な場合は BigDecimal を使う。
タイトルとURLをコピーしました