Java | 基礎文法:数値リテラル

Java Java
スポンサーリンク

数値リテラルの全体像

Java の「数値リテラル」は、コードに直接書く数値のことです。たとえば 423.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 進扱い」になることです。0809 は 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
Java

float を使う場合は必ず 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

守るべきルール:

  • 先頭や末尾に置けない(_123123_ は不可)
  • 小数点の直前・直後、指数記号の直前・直後には置けない(3_.143._141_e3 は不可)
  • 基数プレフィックス(0x, 0b)の直後は置けない(0x_CA は可、0x_ は不可)

「どこでも置けるわけではない」ことだけ覚えておけば十分です。


符号、範囲、型昇格の落とし穴

符号はリテラルではなく演算子

-42 は「リテラル 42 に単項マイナスを適用」した式です。最小値付近の演算ではオーバーフローに注意します。

int min = Integer.MIN_VALUE;
int pos = -min; // オーバーフローで同値(負のまま)になる
Java

「符号を反転すれば正になる」とは限りません。境界値は専用の扱いをしましょう。

型昇格と縮小の注意

演算は「より広い型」に昇格します。int * longlong。逆に狭い型への代入は暗黙変換されません。

long a = 3_000_000_000L;
int b = (int) a; // 範囲外で値が壊れる可能性
Java

リテラルの型は「後続の式全体の型」に影響するため、必要なら LF を付けて先手を打つのが安全です。


実用例で理解する

例 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);
    }
}
Java

2 進・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
    }
}
Java

double のリテラルで金額を扱わない。文字列から 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。サイズや精度が足りないと感じたら、ためらわずに longBigDecimal に切り替える。
  • 基数指定は「意味が伝わる表記」を選ぶ。ビット操作は 2/16 進、通常の件数は 10 進。
  • アンダースコアで桁区切りして可読性を上げる。ルール違反(先頭/末尾、小数点や指数の直前直後)に注意。
  • 先頭ゼロは 8 進を意味する罠。08 は不正。数字先頭のゼロは避ける。
  • 計算は型昇格が起きる。リテラルに接尾辞を付けて「意図した型」で式を構成するとバグを防げる。

タイトルとURLをコピーしました