Java | 数値リテラルに桁区切り文字(_)を使う方法

Java Java
スポンサーリンク

Javaの数値リテラルの桁区切りを解説

長い数字って、目で追うのがしんどいですよね。Javaでは、数字の見やすさを上げるために「アンダースコア(_)」を数字の間に入れて区切ることができます。プログラムが速くなるわけではないけれど、ミスを減らして読みやすくするための“人間向け”の工夫です。


何ができるのか

  • 目的: 長い数字を読みやすくするために、数値リテラルの中に「_」を入れられる。
  • 効果: 実際の値は変わらない。出力や計算ではアンダースコアは無視される。
  • 使える場所: 整数、2進数、16進数、浮動小数点数でも使える。
int population = 1_234_567;   // 1234567 と同じ
double pi = 3.1415_9265;      // 3.14159265 と同じ
int bin = 0b1010_1101;        // 2進数でもOK
int hex = 0x3F02_EF01;        // 16進数でもOK
System.out.println(population); // → 1234567 (アンダースコアは表示されない)
Java

どこに入れてよい?どこがダメ?

  • 入れてよい場所:
    • ラベル: 桁の区切りとして数字と数字の間
    • 例:
int a = 34_125_910;   // よくある3桁区切り
int b = 3_4_1_2_5_9_1_0; // 位置は自由(読みやすさ重視で)
Java
  • 入れてはいけない場所:
    • ラベル: 先頭・末尾・小数点の直前直後・接頭辞の直後・指数記号の直後
    • 例:
int ng1 = _123;        // 先頭はNG
int ng2 = 123_;        // 末尾はNG
double ng3 = 3._1415;  // 小数点の直前はNG
double ng4 = 3_.1415;  // 小数点の直後もNG
int ng5 = 0x_1234;     // 0x の直後はNG
double ng6 = 1.23e_10; // e の直後はNG(指数部)
Java

いつ使うと便利?

  • 長い定数を扱うとき: 金額、人口、ID、バッファサイズなど。
  • 異なる基数での表現: ビットパターン(2進数)や色コード(16進数)を見やすく。
  • チーム開発の可読性: 他の人が見ても一目で桁が分かるように。
// 金額や容量を扱う例
long budget = 12_000_000_000L; // 120億
int buffer = 64_ * 1024;       // これは演算。桁区切りではなく、慣例として 64KB を表す

// ビットフラグを読みやすく
int flags = 0b1111_0000_1010_0101;
Java

よくある落とし穴と対策

  • ラベル: 末尾や小数点の隣に置いてしまう
    • 対策: 「数字と数字の間」だけ、と覚える。
  • ラベル: 接頭辞(0x, 0b, 0)直後に置いてしまう
    • 対策: 0xや0bの後はすぐに数字を続ける。区切りはその後から。
  • ラベル: e(指数)や型サフィックスの直前直後
    • 対策: eやf/d/Lの直前直後には置かない。
    float f = 1.23_4f; // OK(fの直前に_はNG、数字間はOK) double d = 6.022_14076e23; // OK(eの前は数字間、eの直後には入れない)

実践例題

例題1: 長い整数を見やすくする

  • 課題: 次の2つの宣言は同じ値です。出力して確認しましょう。
public class Main {
  public static void main(String[] args) {
    int a = 123456789;
    int b = 123_456_789;
    System.out.println(a); // 123456789
    System.out.println(b); // 123456789
    System.out.println(a == b); // true
  }
}
Java
  • ポイント: アンダースコアは可読性のためで、値は変わらない。

例題2: 浮動小数点での区切り

  • 課題: 円周率を読みやすく記述して計算しよう。
public class Main {
  public static void main(String[] args) {
    double pi = 3.1415_9265;
    double r = 10.0;
    double area = pi * r * r;
    System.out.println(area); // 314.159265
  }
}
Java
  • ポイント: 小数部でも数字同士の間なら区切れる。小数点の隣はNG。

例題3: 2進数・16進数での区切り

  • 課題: ビットパターンやカラーコードを見やすく。
public class Main {
  public static void main(String[] args) {
    int bits = 0b1101_0010_1111_0000;
    int color = 0xFF_CC_00; // #FFCC00
    System.out.println(bits);  // 53936
    System.out.println(color); // 16763904
  }
}
Java
  • ポイント: 0b/0xの直後には入れない。まとまりごとに区切ると意味が取りやすい。

例題4: NGパターンをコンパイルしてみる

  • 課題: 次のコードはエラーになります。なぜかをコメントで説明しましょう。
public class Main {
  public static void main(String[] args) {
    // int x = _123;       // 先頭に_はNG
    // double y = 3_.14;   // 小数点の直後に_はNG
    // int z = 0x_1A2B;    // 0xの直後に_はNG
  }
}
Java
  • ポイント:「数字と数字の間だけOK」を守る。

使いこなしのコツ

  • チームでルール化: 3桁ごと(例: 1_000_000)に統一すると読みやすさが揃う。
  • 意味ごとに区切る: ビットは4ビットずつ、色はR_G_Bのまとまりで区切る。
  • 過度な区切りは避ける: 読みやすさが下がるなら入れすぎない。

練習問題

  • 問題1: 次の人口を読みやすく書き換えてください。132435465
  • 問題2: 次の16進数の色コードを意味が分かるように区切ってください。0x12AB34
  • 問題3: 次の2進数のフラグを4ビットずつ区切ってください。0b101101001011
  • 模範解答例:
    • 問題1: 132_435_465
    • 問題2: 0x12_AB_34(12=赤の高位、AB=赤の低位+緑の高位、34=緑の低位+青の高位、など用途に合わせて)
    • 問題3: 0b1011_0100_1011

まとめ

  • 目的: アンダースコアは数字の“見た目”を整えて、ミスを減らすための機能。
  • ルール: 数字と数字の間ならOK。先頭・末尾・小数点の隣・接頭辞の直後・指数の直後はNG。
  • 活用: 金額、容量、ビット列、カラーコードなどで積極的に使うと可読性が上がる。
タイトルとURLをコピーしました