数値リテラルの全体像
Java の「数値リテラル」は、コードに直接書く数値のことです。たとえば 42 や 3.14 のように書いたものがリテラルです。整数リテラルのデフォルト型は int、小数リテラルのデフォルト型は double です。必要に応じて接尾辞(L, F など)や基数指定(2/8/16 進)を使って型や表現を変えます。リテラルは「その場で値を確定しておける」ので、初期化や定数定義で強力です。
整数リテラルの基礎と基数指定
10 進・2 進・8 進・16 進の書き方
- 10 進(通常):
int n = 1234; - 2 進: 先頭に
0b(または0B)を付けます。int mask = 0b1010; // 10 - 8 進: 先頭の
0が 8 進の意味になります。int oct = 010; // 8 - 16 進: 先頭に
0x(または0X)。int hex = 0xFF; // 255
注意点は「先頭に 0 を付けると 8 進扱い」になることです。08 や 09 は 8 進として不正なのでコンパイルエラーになります。数字先頭のゼロは意味が変わるため、見た目調整目的で付けるのは避けましょう。
型のデフォルトと接尾辞
整数リテラルはデフォルトで int 型です。int に収まらない大きさは L(または l)を付けて long にします。
int i = 2_147_483_647; // int の最大値
long big = 3_000_000_000L; // int を超えるので L が必須
Java接尾辞は「型を指示する旗」です。桁が大きい値は躊躇なく L を付けて安全側に倒しましょう。
浮動小数点リテラルと精度管理
通常の小数と指数表記
小数リテラルはデフォルトで double。指数(科学表記)も使えます。
double d1 = 3.14;
double d2 = 1.23e3; // 1230.0
float f1 = 3.14F; // F を付けると float
Javafloat を使う場合は必ず F(または f)を付けます。float f = 3.14; は型が合わずコンパイルエラーになります。
16 進の浮動小数点(上級だが知っておくと得)
Java は 16 進の浮動小数点も書けます。p は 2 の指数を表します。
double hd = 0x1.0p3; // 1.0 × 2^3 = 8.0
Javaバイナリ精度を直接扱う必要がある計算で役立ちますが、通常の開発では double/float の 10 進表記で十分です。
浮動小数点の誤差(重要)
二進数で小数を表すため、ぴったり表せない値が多く、計算誤差が生じます。
System.out.println(0.1 + 0.2); // 0.30000000000000004 のような出力
Java金額など厳密さが必要な場合は BigDecimal を使い、リテラルではなく「文字列から生成」するのが基本です。
BigDecimal price = new BigDecimal("1999.50");
Java数値の見やすさを上げる桁区切り(アンダースコア)
桁区切りの使い方とルール
アンダースコア _ はリテラルの「桁区切り」として使えます。可読性が大幅に向上します。
int readable = 1_000_000;
long card = 1234_5678_9012_3456L;
double ratio = 3.1415_9265;
int bin = 0b1111_0000_1010_0101;
int hex = 0xCA_FE_BA_BE;
Java守るべきルール:
- 先頭や末尾に置けない(
_123や123_は不可) - 小数点の直前・直後、指数記号の直前・直後には置けない(
3_.14、3._14、1_e3は不可) - 基数プレフィックス(
0x,0b)の直後は置けない(0x_CAは可、0x_は不可)
「どこでも置けるわけではない」ことだけ覚えておけば十分です。
符号、範囲、型昇格の落とし穴
符号はリテラルではなく演算子
-42 は「リテラル 42 に単項マイナスを適用」した式です。最小値付近の演算ではオーバーフローに注意します。
int min = Integer.MIN_VALUE;
int pos = -min; // オーバーフローで同値(負のまま)になる
Java「符号を反転すれば正になる」とは限りません。境界値は専用の扱いをしましょう。
型昇格と縮小の注意
演算は「より広い型」に昇格します。int * long は long。逆に狭い型への代入は暗黙変換されません。
long a = 3_000_000_000L;
int b = (int) a; // 範囲外で値が壊れる可能性
Javaリテラルの型は「後続の式全体の型」に影響するため、必要なら L や F を付けて先手を打つのが安全です。
実用例で理解する
例 1: ビットマスク(2 進・16 進の利点)
public class BitMask {
public static void main(String[] args) {
int READ = 0b0001;
int WRITE = 0b0010;
int EXEC = 0b0100;
int perm = READ | WRITE; // 0011
boolean canExec = (perm & EXEC) != 0;
System.out.printf("perm=0x%02X exec=%b%n", perm, canExec);
}
}
Java2 進・16 進は「ビットの意図」が見えるので、権限やフラグ管理が明快になります。
例 2: 金額計算は BigDecimal(誤差回避)
import java.math.BigDecimal;
public class Money {
public static void main(String[] args) {
BigDecimal price = new BigDecimal("1999.50");
BigDecimal tax = new BigDecimal("0.10");
BigDecimal total = price.multiply(tax).add(price);
System.out.println(total); // 2199.45
}
}
Javadouble のリテラルで金額を扱わない。文字列から BigDecimal を生成し、誤差のない計算をします。
例 3: 桁区切りで読みやすく
public class ReadableNumbers {
public static void main(String[] args) {
long users = 12_345_678_901L;
double rate = 0.000_123;
System.out.println(users + " " + rate);
}
}
Javaアンダースコアは「意味を変えずに可読性を上げる」安全なテクニックです。
設計の指針(重要ポイントのまとめ)
- 整数はデフォルト
int、小数はデフォルトdouble。サイズや精度が足りないと感じたら、ためらわずにlongやBigDecimalに切り替える。 - 基数指定は「意味が伝わる表記」を選ぶ。ビット操作は 2/16 進、通常の件数は 10 進。
- アンダースコアで桁区切りして可読性を上げる。ルール違反(先頭/末尾、小数点や指数の直前直後)に注意。
- 先頭ゼロは 8 進を意味する罠。
08は不正。数字先頭のゼロは避ける。 - 計算は型昇格が起きる。リテラルに接尾辞を付けて「意図した型」で式を構成するとバグを防げる。
