【2026年7月版】Java BigDecimalのcompareTo比較・使い方を完全解説|double精度問題の解決から金融計算の実践まで

【2026年7月版】Java BigDecimalのcompareTo比較・使い方を完全解説|double精度問題の解決から金融計算の実践まで

「Javaで小数の計算をしたら、なぜか0.9999…のような変な値が出た」——Javaを学び始めた方がほぼ必ずぶつかる問題です。その原因と解決方法が「BigDecimal」です。

この記事では、BigDecimalがなぜ必要か・基本的な使い方・compareToによる大小比較・equalsとの違い・金融・消費税・為替計算の実践例まで体系的に解説します。さらに、Claude CodeでBigDecimalのコードを素早く書いてもらう実践的な方法まで踏み込みます。

弊社(株式会社GENAI)は非エンジニアの方でも「Claude Codeを使ってJavaコードを業務に活かす」支援を行っています。プログラミング経験がゼロの方でも理解できる説明を心がけています。

代表菅澤 代表菅澤
「1 − 0.9が0.1にならない」というのは、コンピュータが10進数ではなく2進数で小数を表現しているためです。人間にとっての「0.1」は2進数では無限小数になるため、コンピュータはそれを近似値で保存します。この誤差が積み重なると金融計算では致命的なバグになるので、Javaではお金の計算にdoubleを使わないのが鉄則です。
AI鬼管理山崎 AI鬼管理山崎
「BigDecimalは難しそう」という印象がありますが、基本は「文字列かint/longで数値を作って、専用のメソッドで計算する」だけです。doubleと違いが分かれば、後は使い方を覚えるだけです。
✔️doubleで小数計算が正確にならない理由(浮動小数点数の限界)
✔️BigDecimalのオブジェクト生成・四則演算・スケール設定の方法
✔️compareToメソッドの戻り値(-1/0/1)の意味と使い方
✔️equals vs compareTo の決定的な違いと「equals禁止」の理由
✔️消費税計算・金融計算・為替変換でのBigDecimal実践例
✔️Claude CodeでBigDecimalのボイラープレートコードを即生成する方法
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月版】Java BigDecimalのcompareTo比較・使い方を完全解説|double精度問題の解決から金融計算の実践まで
Java BigDecimalのcompareTo比較メソッドをゼロから解説。doubleの精度問題をなぜBigDecimalが解決するのか、equals vs compareToの違い、消費税・金融計算の実践例、Claude CodeでBigDecimalコードを素早く書く方法まで完全網羅。

01 BigDecimalとは?doubleではダメな理由 コンピュータの2進数表現が引き起こす「0.1が0.1にならない」問題

まず、なぜBigDecimalが必要なのかを理解するために「doubleの問題」から見てみましょう。

// doubleの計算に潜む罠
public class DoubleTest {
    public static void main(String[] args) {
        double a = 1.0;
        double b = 0.9;
        System.out.println(a - b);  // 0.1を期待するが...

        // 実際の出力: 0.09999999999999998
        // !!!0.1ではない!!!
    }
}

これはバグではなく、コンピュータの数値表現の「仕様」です。コンピュータは全ての数値を2進数(0と1の組み合わせ)で表現します。人間が使う10進数の「0.1」は、2進数で表現しようとすると「0.0001100110011001100…」と無限に続く小数になります。コンピュータは無限の桁数を扱えないため、有限の桁数で近似値を保存します。この近似誤差が計算の都度積み重なります。

📚 用語解説

浮動小数点数(Floating Point Number):コンピュータが小数を表現するための方式。IEEE 754標準に基づき、符号・仮数部・指数部の3つで数値を表す。Javaのfloat(32bit)とdouble(64bit)が浮動小数点数型。表現できる値の範囲は広いが、2進数の近似誤差が生じる。お金・数量・割合など精度が重要な計算には不向き。

精度速度お金の計算適した用途
double近似値(誤差あり)非常に高速❌ NG(誤差が致命的)物理計算・座標・グラフィック
floatdoubleより低精度高速❌ NG(より大きな誤差)メモリ制約が厳しい場合のみ
int/long整数のみ(誤差なし)高速△(円単位のみ可)整数での金額管理(円単位)
BigDecimal任意精度(誤差なし)低速(計算コスト高)✅ 推奨金融・会計・税金・高精度計算

「BigDecimalは遅い」という点が気になる方もいますが、金融系・業務系システムでは「正確性 > 速度」です。1億回の計算をループするような処理でなければ、BigDecimalの速度は実用上問題になりません。

02 BigDecimalの基本:生成・四則演算・スケール コンストラクタの正しい使い方とRoundingModeの選び方

2-1. BigDecimalの生成方法

BigDecimalを作る方法は主に3つあります。注意点:doubleを引数にするコンストラクタは使わないこと。doubleの誤差をそのまま引き継いでしまいます。

import java.math.BigDecimal;
import java.math.MathContext;

// ===== 正しい生成方法 =====

// 方法1: 文字列から生成(推奨!誤差なし)
BigDecimal bd1 = new BigDecimal("1.5");
BigDecimal bd2 = new BigDecimal("0.1");

// 方法2: valueOf(double→文字列を経由するため誤差なし)
BigDecimal bd3 = BigDecimal.valueOf(1.5);
BigDecimal bd4 = BigDecimal.valueOf(100);

// ===== NG: やってはいけない生成方法 =====
// doubleから直接生成するとdoubleの誤差を引き継ぐ!
BigDecimal bad = new BigDecimal(0.1);  // NG!!
// bad.toString() → "0.1000000000000000055511151231257827021181583404541015625"
// 見た目は0.1に見えるが、内部に誤差が含まれる
⚠️ new BigDecimal(double値)は絶対に使わない

new BigDecimal(0.1)と書くと、0.1のdoubleの近似値がそのままBigDecimalになってしまいます。文字列で渡すnew BigDecimal("0.1")かBigDecimal.valueOf(0.1)を使うことで、意図した正確な値のBigDecimalが作れます。これはBigDecimal最重要の注意点です。

📚 用語解説

スケール(Scale):BigDecimalで小数点以下の桁数を表すプロパティ。例えばnew BigDecimal("1.50")のスケールは2、new BigDecimal("1.5")のスケールは1。同じ数値でもスケールが異なるとequals()ではfalseになる(1.50 ≠ 1.5)が、compareTo()では同じ(1.50 == 1.5)として扱われる。これがequals()を使ってはいけない理由の核心。

2-2. 四則演算のメソッド

演算メソッドコード例注意点
加算add()a.add(b)スケールは加算する両者の最大スケール
減算subtract()a.subtract(b)同上
乗算multiply()a.multiply(b)スケールは両者のスケールの合計
除算divide()a.divide(b, 2, RoundingMode.HALF_UP)割り切れない場合はRoundingMode必須
絶対値abs()a.abs()負の値を正にする
符号反転negate()a.negate()正を負に、負を正に

📚 用語解説

RoundingMode(丸めモード):BigDecimalの除算や小数点以下桁数を制限する際の丸め処理方式。HALF_UP(四捨五入)・FLOOR(切り捨て)・CEILING(切り上げ)・HALF_EVEN(銀行の丸め)等がある。divide()メソッドで割り切れない値を計算する際はRoundingModeを必ず指定しないとArithmeticExceptionが発生する。消費税計算ではFLOOR(切り捨て)またはHALF_UP(四捨五入)が一般的。

import java.math.BigDecimal;
import java.math.RoundingMode;

BigDecimal price = new BigDecimal("1000");
BigDecimal taxRate = new BigDecimal("0.10");
BigDecimal discount = new BigDecimal("100");

// 消費税の計算(小数点以下は四捨五入)
BigDecimal tax = price.multiply(taxRate)
                      .setScale(0, RoundingMode.HALF_UP);
System.out.println("消費税: " + tax);  // 100

// 税込み価格 = 本体価格 + 消費税
BigDecimal totalPrice = price.add(tax);
System.out.println("税込み: " + totalPrice);  // 1100

// 割引後の価格
BigDecimal discountedPrice = totalPrice.subtract(discount);
System.out.println("割引後: " + discountedPrice);  // 1000

// 単価と数量から合計(10個購入)
BigDecimal quantity = new BigDecimal("10");
BigDecimal total = price.multiply(quantity);
System.out.println("10個の合計: " + total);  // 10000

2-3. RoundingMode(丸めモード)の選び方

BigDecimalで割り算をする際、割り切れない場合の処理方法(RoundingMode)を指定する必要があります。

RoundingMode動作例(1.25 → 小数点1位)主な用途
HALF_UP0.5以上を切り上げ(四捨五入)1.3一般的な四捨五入(最も一般的)
HALF_DOWN0.5を切り捨て(0.5未満のみ切り上げ)1.2銀行業界の一部システム
HALF_EVEN0.5はイチバン近い偶数に丸め偶数に丸め統計・科学計算(バンカーズラウンド)
CEILINGプラス方向に切り上げ1.3プラスの値を大きめに見積もる場合
FLOORマイナス方向に切り捨て1.2プラスの値を小さめに見積もる場合
UP0から離れる方向に丸め1.3(負数も同様)安全側に多め計算
DOWN0に近づく方向に切り捨て1.2(負数も同様)トランケーション(切り捨て)
UNNECESSARY丸め不要(割り切れない場合はエラー)ArithmeticException割り切れることが確実な場合

03 compareToで大小比較する方法 戻り値(-1/0/1)の意味とif文・ソートへの応用

BigDecimalの大小比較にはcompareToメソッドを使います。2つの値を比較して、関係性を整数(-1・0・1)で返します。

📚 用語解説

compareToメソッド:java.lang.Comparableインターフェースで定義された比較メソッド。a.compareTo(b)を呼び出したとき、aがbより小さければ負の整数(通常-1)、等しければ0、大きければ正の整数(通常1)を返す。BigDecimalだけでなく、String・Integer・LocalDateなど多くのJavaクラスが実装している。

import java.math.BigDecimal;

BigDecimal a = new BigDecimal("1.5");
BigDecimal b = new BigDecimal("2.0");
BigDecimal c = new BigDecimal("1.5");

// a.compareTo(b): aとbを比較
System.out.println(a.compareTo(b));  // -1  → a < b(aの方が小さい)
System.out.println(b.compareTo(a));  //  1  → b > a(bの方が大きい)
System.out.println(a.compareTo(c));  //  0  → a == c(等しい)

// if文での使い方
if (a.compareTo(b) < 0) {
    System.out.println("aはbより小さい");  // この行が実行される
}
if (a.compareTo(b) == 0) {
    System.out.println("aとbは等しい");
}
if (a.compareTo(b) > 0) {
    System.out.println("aはbより大きい");
}
a.compareTo(b)の戻り値意味if文での使い方日本語訳
-1(負の整数)a < b(aはbより小さい)if (a.compareTo(b) < 0)aはbより小さい場合
0a == b(同じ値)if (a.compareTo(b) == 0)aとbが等しい場合
1(正の整数)a > b(aはbより大きい)if (a.compareTo(b) > 0)aはbより大きい場合
💡 a.compareTo(b)の「<0は小さい」という覚え方

戻り値が「マイナス(< 0)」の時、aはbより「小さい」——マイナスと小さいをセットで覚えます。反対に、戻り値が「プラス(> 0)」の時、aはbより「大きい」。0の時は「等しい」。これを3秒で思い出せるようになれば十分です。

3-1. compareToを使った実践的な比較コード

import java.math.BigDecimal;

public class CompareDemo {
    // 在庫量が最低在庫量を下回っているか判定
    public static boolean isLowStock(BigDecimal currentStock,
                                      BigDecimal minimumStock) {
        // currentStock < minimumStock の場合trueを返す
        return currentStock.compareTo(minimumStock) < 0;
    }

    // 2つの金額のうち大きい方を返す
    public static BigDecimal maxAmount(BigDecimal a, BigDecimal b) {
        return (a.compareTo(b) >= 0) ? a : b;
    }

    // 金額が上限を超えているかチェック
    public static boolean exceedsLimit(BigDecimal amount, BigDecimal limit) {
        return amount.compareTo(limit) > 0;
    }

    public static void main(String[] args) {
        BigDecimal current = new BigDecimal("5");
        BigDecimal minimum = new BigDecimal("10");
        System.out.println(isLowStock(current, minimum));  // true(在庫不足)

        BigDecimal price1 = new BigDecimal("1980");
        BigDecimal price2 = new BigDecimal("2480");
        System.out.println(maxAmount(price1, price2));  // 2480(高い方を返す)

        BigDecimal purchase = new BigDecimal("1500000");
        BigDecimal creditLimit = new BigDecimal("1000000");
        System.out.println(exceedsLimit(purchase, creditLimit));  // true(上限超過)
    }
}

3-2. ListのBigDecimalをcompareToでソートする

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class BigDecimalSort {
    public static void main(String[] args) {
        List<BigDecimal> prices = new ArrayList<>(Arrays.asList(
            new BigDecimal("3980"),
            new BigDecimal("1280"),
            new BigDecimal("5800"),
            new BigDecimal("980"),
            new BigDecimal("2500")
        ));

        // 昇順ソート(安い順)— Comparator.naturalOrder()またはcompareTo使用
        prices.sort(BigDecimal::compareTo);
        System.out.println("昇順: " + prices);
        // [980, 1280, 2500, 3980, 5800]

        // 降順ソート(高い順)
        prices.sort((a, b) -> b.compareTo(a));
        System.out.println("降順: " + prices);
        // [5800, 3980, 2500, 1280, 980]

        // 最小値・最大値
        BigDecimal min = prices.stream()
                               .min(BigDecimal::compareTo)
                               .orElse(BigDecimal.ZERO);
        BigDecimal max = prices.stream()
                               .max(BigDecimal::compareTo)
                               .orElse(BigDecimal.ZERO);
        System.out.println("最安値: " + min + ", 最高値: " + max);
    }
}
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 equalsとcompareToの違いと落とし穴 スケールの違いで1.50とequals(1.5)がfalseになる罠

BigDecimalで値の比較をする際に、equals()を使うのは重大な罠があります。

import java.math.BigDecimal;

BigDecimal a = new BigDecimal("1.50");  // スケール=2
BigDecimal b = new BigDecimal("1.5");   // スケール=1

// equals: スケールも含めて厳密に比較
System.out.println(a.equals(b));           // false !!! ← 落とし穴
System.out.println(a.equals(new BigDecimal("1.50")));  // true

// compareTo: 数値の大小のみ比較(スケール無視)
System.out.println(a.compareTo(b) == 0);  // true ← 正しい比較
System.out.println(a.compareTo(new BigDecimal("1.50")) == 0); // true
⚠️ BigDecimalでは等値比較にequals()を使わない

new BigDecimal("1.50").equals(new BigDecimal("1.5"))はfalseを返します。これはスケール(小数点以下の桁数)が異なるためです。1.50のスケールは2、1.5のスケールは1で、equalsはスケールも含めて厳密に比較するためです。等値確認にはcompareTo(other) == 0を使うことが鉄則です。

比較方法比較対象1.50 vs 1.5の結果用途
equals()値 + スケール(小数点桁数)false(スケールが違う)スケールまで一致を確認したい場合のみ
compareTo() == 0値のみ(数値として同じか)true(値は同じ)数値として等しいかの確認(推奨)
==オブジェクトの参照false(別オブジェクト)使用禁止(オブジェクトのため常にfalse)
🏆
VERDICT
compareTo一択
等値比較はcompareTo(other) == 0 が正解。equals()は「スケールも含めて完全一致」の場合のみ使用。大小比較・等値確認の両方でcompareToを使えば間違いない。

05 BigDecimalの実践活用:金融・消費税・為替計算 現場で実際に使うコードパターンをシーン別に紹介

5-1. 消費税計算(切り捨て・四捨五入)

import java.math.BigDecimal;
import java.math.RoundingMode;

public class TaxCalculator {
    private static final BigDecimal TAX_RATE = new BigDecimal("0.10"); // 10%

    // 消費税を計算(切り捨て)
    public static BigDecimal calcTax(BigDecimal price) {
        return price.multiply(TAX_RATE).setScale(0, RoundingMode.FLOOR);
    }

    // 税込み価格(本体価格 + 消費税)
    public static BigDecimal calcTaxIncluded(BigDecimal price) {
        BigDecimal tax = calcTax(price);
        return price.add(tax);
    }

    // 税抜き価格を計算(税込み÷1.1、小数点以下切り捨て)
    public static BigDecimal calcTaxExcluded(BigDecimal taxIncludedPrice) {
        BigDecimal divisor = BigDecimal.ONE.add(TAX_RATE); // 1 + 0.10 = 1.10
        return taxIncludedPrice.divide(divisor, 0, RoundingMode.FLOOR);
    }

    public static void main(String[] args) {
        BigDecimal price = new BigDecimal("980");
        System.out.println("本体価格: " + price + "円");
        System.out.println("消費税: " + calcTax(price) + "円");       // 98円
        System.out.println("税込み: " + calcTaxIncluded(price) + "円"); // 1078円

        BigDecimal taxIncluded = new BigDecimal("1078");
        System.out.println("税抜き逆算: " + calcTaxExcluded(taxIncluded) + "円"); // 980円
    }
}

5-2. 為替換算(ドル→円)

import java.math.BigDecimal;
import java.math.RoundingMode;

public class CurrencyConverter {
    // ドルを円に換算(小数点2位まで)
    public static BigDecimal usdToJpy(BigDecimal usd, BigDecimal exchangeRate) {
        return usd.multiply(exchangeRate).setScale(2, RoundingMode.HALF_UP);
    }

    // 基準レートより高いか判定(割高判定)
    public static boolean isOverRate(BigDecimal currentRate, BigDecimal baseRate) {
        return currentRate.compareTo(baseRate) > 0;
    }

    public static void main(String[] args) {
        BigDecimal usdAmount = new BigDecimal("100.00");
        BigDecimal exchangeRate = new BigDecimal("155.23");  // 1ドル=155.23円

        BigDecimal jpyAmount = usdToJpy(usdAmount, exchangeRate);
        System.out.println("100ドル = " + jpyAmount + "円"); // 15523.00円

        BigDecimal baseRate = new BigDecimal("150.00");
        if (isOverRate(exchangeRate, baseRate)) {
            System.out.println("基準レートより円安(割高)です");
        }
    }
}

5-3. 複数商品の合計金額集計

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

public class OrderCalculator {
    record OrderItem(String name, BigDecimal price, int quantity) {}

    // 合計金額を計算(全商品の価格×数量の合計)
    public static BigDecimal calcTotal(List<OrderItem> items) {
        BigDecimal total = BigDecimal.ZERO;
        for (OrderItem item : items) {
            BigDecimal subtotal = item.price()
                .multiply(new BigDecimal(item.quantity()));
            total = total.add(subtotal);
        }
        return total;
    }

    public static void main(String[] args) {
        List<OrderItem> order = List.of(
            new OrderItem("Tシャツ", new BigDecimal("2980"), 2),
            new OrderItem("ジーンズ", new BigDecimal("7800"), 1),
            new OrderItem("靴下", new BigDecimal("490"), 3)
        );

        BigDecimal total = calcTotal(order);
        System.out.println("合計: " + total + "円");  // 15230円

        // 合計が10000円以上なら送料無料
        BigDecimal freeShippingThreshold = new BigDecimal("10000");
        if (total.compareTo(freeShippingThreshold) >= 0) {
            System.out.println("送料無料!");
        }
    }
}

06 BigDecimalのよくあるミスとその対策 初学者が必ずハマる4つの落とし穴と解決策

ミスのパターンダメな書き方正しい書き方理由
doubleコンストラクタを使うnew BigDecimal(0.1)new BigDecimal("0.1")またはBigDecimal.valueOf(0.1)doubleの誤差を引き継ぐ
等値比較にequals()を使うa.equals(b)a.compareTo(b) == 0スケールが違うとfalseになる
==で比較するa == ba.compareTo(b) == 0オブジェクトの参照を比較するので常にfalse
divide()でRoundingModeを省略a.divide(b)a.divide(b, 2, RoundingMode.HALF_UP)割り切れない場合にArithmeticException
加算結果を元の変数に代入し忘れるtotal.add(amount)total = total.add(amount)BigDecimalはimmutable(不変)なので新しいオブジェクトが返る

📚 用語解説

immutableオブジェクト(不変オブジェクト):一度生成されたら内部状態を変更できないオブジェクト。JavaのBigDecimal・String・Integerなどが代表例。「total.add(amount)」と書いてもtotalは変わらず、新しいBigDecimalが戻り値として返される。そのため計算結果は「total = total.add(amount)」のように必ず変数に代入する必要がある。immutableオブジェクトはスレッドセーフで安全というメリットがある。

⚠️ BigDecimalはimmutableオブジェクト

BigDecimalのオブジェクトは一度生成したら変更できない(immutable)です。add()・multiply()等のメソッドは元のオブジェクトを変更するのではなく、計算結果の新しいBigDecimalを返します。そのため「total.add(amount);」と書いても何も起きません。必ず「total = total.add(amount);」と戻り値を変数に代入してください。

BigDecimalを作る
文字列コンストラクタ
またはvalueOf()
を使う
計算する
add/subtract/
multiply/divide
等のメソッドで
結果を変数に代入
result = a.add(b)
戻り値を受け取る
(immutableのため)
比較する
compareTo()のみ使用
equals()や==は
使わない
表示・保存
toString()やDBへ
保存。必要なら
setScaleで桁数指定
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 【独自】Claude CodeでBigDecimal処理を即座に実装する 非エンジニアでも「指示するだけ」でJavaコードを生成できる

JavaのBigDecimalは正確に使うためのルールが多く、最初は覚えるのが大変です。Claude Codeを使えば、自然言語で指示するだけで正確なBigDecimalコードを生成できます。

7-1. Claude Codeに依頼できるBigDecimal関連タスク

✔️「消費税10%を計算するメソッドをBigDecimalで書いて。切り捨てで」
✔️「このdoubleを使った計算コードをBigDecimalに書き換えて」
✔️「商品リストの合計金額を計算してcompareToで送料無料判定するコードを書いて」
✔️「BigDecimalの配列を昇順・降順でソートするユーティリティクラスを書いて」
✔️「このコードのBigDecimalの使い方に誤りがないか確認して(equals使ってるとか)」
✔️「为替レートの変換でRoundingMode.HALF_EVENを使う理由を教えて」

7-2. Claude Codeにレビューしてもらう

既存のJavaコードをClaude Codeに見てもらい、BigDecimalの誤用がないか確認してもらう使い方も非常に効果的です。

// Claude Codeへの指示例:
// 「以下のコードのBigDecimalの使い方に問題がないか確認して。
//  特にdoubleコンストラクタ・equals使用・RoundingMode省略の問題を見つけて」

// 問題のあるコード
public BigDecimal calculateTotal(double price, int quantity) {
    BigDecimal bd = new BigDecimal(price);  // ← 問題1: doubleコンストラクタ
    BigDecimal qty = new BigDecimal(quantity);
    BigDecimal total = bd.multiply(qty);
    if (total.equals(new BigDecimal("10000"))) {  // ← 問題2: equals比較
        return total.divide(new BigDecimal("1.1")); // ← 問題3: RoundingModeなし
    }
    return total;
}

// Claude Codeが提案する修正コード:
public BigDecimal calculateTotal(String price, int quantity) {
    BigDecimal bd = new BigDecimal(price);  // ← 文字列に変更
    BigDecimal qty = new BigDecimal(quantity);
    BigDecimal total = bd.multiply(qty);
    if (total.compareTo(new BigDecimal("10000")) == 0) {  // ← compareTo == 0
        return total.divide(new BigDecimal("1.1"), 2, RoundingMode.HALF_UP); // ← RoundingMode追加
    }
    return total;
}

JavaとClaude Codeを組み合わせた業務システム開発を支援します

「Javaで社内ツールを作りたいがコードが書けない」「既存のJavaシステムのバグをAIで診断・修正したい」という方に、Claude Codeを活用した開発支援を提供しています。

代表菅澤 代表菅澤
BigDecimalの知識がなくても、「こういう計算が必要」という要件をClaude Codeに伝えれば、正確なコードを生成してもらえます。まず無料相談で、あなたの業務に合った開発支援の方法を一緒に考えましょう。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. BigDecimalはどのような場面で必ず使うべきですか?

A. 金額・税金・割引率・為替レート・在庫数量(重量など小数点が必要)を扱うシステムでは必ずBigDecimalを使います。「1円の誤差も許せない」場面が全てBigDecimalの対象です。逆にゲームの座標・物理シミュレーション・グラフィック処理など「多少の誤差が許容される計算」にはdoubleが適しています(BigDecimalより高速なため)。

Q. BigDecimalとintの使い分けはどうすればいいですか?

A. お金を「円単位の整数」として扱うなら、int(またはlong)でも誤差は生じません。例えば「商品価格は全て円単位で管理し、銭・厘の端数は出ない」というシステムなら、long型で金額を保持するのが最も速くて安全です。しかし「小数点以下のリベート率(1.5%)」「税率(10.0%)」「外国通貨のセント単位」を扱う場合はBigDecimalが必要です。

Q. compareTo()の戻り値は必ず-1か0か1ですか?

A. 仕様上は「負の整数・0・正の整数」とだけ定義されており、必ずしも-1と1とは限りません。実装によって-2や3のような値が返される可能性もゼロではないため、「compareTo() < 0」「compareTo() == 0」「compareTo() > 0」という比較を使い、「compareTo() == -1」のような特定の値との比較は避けてください。

Q. BigDecimalをデータベースに保存するにはどうすればいいですか?

A. JDBCを使う場合は`PreparedStatement.setBigDecimal(index, value)`、JPAを使う場合はフィールドに`@Column(precision=12, scale=2)`のようにアノテーションを付けてDECIMAL/NUMERIC型のカラムにマッピングします。DBから読み込む時はBigDecimalで受け取れるため、string型や特別な変換は不要です。

Q. BigDecimalのパフォーマンスはどの程度影響がありますか?

A. BigDecimalはdoubleの100〜1000倍程度遅い処理コストがかかります。ただし「1秒に数万件の計算ループ」でなければ実用上影響は出ません。一般的なWebアプリケーションで「注文時に消費税を計算する」「月次レポートで売上合計を計算する」程度なら、BigDecimalのパフォーマンスはボトルネックになりません。

Q. BigDecimalで0かどうかを判定するには?

A. 「BigDecimal.ZERO.compareTo(value) == 0」または「value.compareTo(BigDecimal.ZERO) == 0」を使います。BigDecimal.ZEROはscale=0の0です。signum()メソッドも使えます(-1: 負、0: ゼロ、1: 正)。絶対に「value == BigDecimal.ZERO」や「value.equals(BigDecimal.ZERO)」は使わないでください(前者はオブジェクト参照比較でfalse、後者はスケールが合わないとfalseになる)。

Q. Claude CodeでJavaのBigDecimalコードを生成してもらう時のコツは?

A. ①「文字列コンストラクタを使うこと」②「equals()ではなくcompareTo()で比較すること」③「divide()には必ずRoundingModeを指定すること」をプロンプトに明記します。Claude Codeはこれらのルールを知っていますが、明示的に制約を書くことで確実に守ったコードが返ってきます。また「このコードのBigDecimalの使い方に問題はないか確認して」というコードレビューの使い方も非常に効果的です。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月18日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。