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。
- 活用: 金額、容量、ビット列、カラーコードなどで積極的に使うと可読性が上がる。
