【2026年7月版】Java BigDecimalのcompareTo比較・使い方を完全解説|double精度問題の解決から金融計算の実践まで
この記事の内容
「Javaで小数の計算をしたら、なぜか0.9999…のような変な値が出た」——Javaを学び始めた方がほぼ必ずぶつかる問題です。その原因と解決方法が「BigDecimal」です。
この記事では、BigDecimalがなぜ必要か・基本的な使い方・compareToによる大小比較・equalsとの違い・金融・消費税・為替計算の実践例まで体系的に解説します。さらに、Claude CodeでBigDecimalのコードを素早く書いてもらう実践的な方法まで踏み込みます。
弊社(株式会社GENAI)は非エンジニアの方でも「Claude Codeを使ってJavaコードを業務に活かす」支援を行っています。プログラミング経験がゼロの方でも理解できる説明を心がけています。
01 WHY BIGDECIMAL 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(誤差が致命的) | 物理計算・座標・グラフィック |
| float | doubleより低精度 | 高速 | ❌ NG(より大きな誤差) | メモリ制約が厳しい場合のみ |
| int/long | 整数のみ(誤差なし) | 高速 | △(円単位のみ可) | 整数での金額管理(円単位) |
| BigDecimal | 任意精度(誤差なし) | 低速(計算コスト高) | ✅ 推奨 | 金融・会計・税金・高精度計算 |
「BigDecimalは遅い」という点が気になる方もいますが、金融系・業務系システムでは「正確性 > 速度」です。1億回の計算をループするような処理でなければ、BigDecimalの速度は実用上問題になりません。
02 BIGDECIMAL BASICS 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(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_UP | 0.5以上を切り上げ(四捨五入) | 1.3 | 一般的な四捨五入(最も一般的) |
| HALF_DOWN | 0.5を切り捨て(0.5未満のみ切り上げ) | 1.2 | 銀行業界の一部システム |
| HALF_EVEN | 0.5はイチバン近い偶数に丸め | 偶数に丸め | 統計・科学計算(バンカーズラウンド) |
| CEILING | プラス方向に切り上げ | 1.3 | プラスの値を大きめに見積もる場合 |
| FLOOR | マイナス方向に切り捨て | 1.2 | プラスの値を小さめに見積もる場合 |
| UP | 0から離れる方向に丸め | 1.3(負数も同様) | 安全側に多め計算 |
| DOWN | 0に近づく方向に切り捨て | 1.2(負数も同様) | トランケーション(切り捨て) |
| UNNECESSARY | 丸め不要(割り切れない場合はエラー) | ArithmeticException | 割り切れることが確実な場合 |
03 COMPARETO METHOD 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より小さい場合 |
| 0 | a == b(同じ値) | if (a.compareTo(b) == 0) | aとbが等しい場合 |
| 1(正の整数) | a > b(aはbより大きい) | if (a.compareTo(b) > 0) | aはbより大きい場合 |
戻り値が「マイナス(< 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);
}
}
04 EQUALS VS COMPARETO 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
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) |
05 PRACTICAL EXAMPLES 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 COMMON MISTAKES 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 == b | a.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)です。add()・multiply()等のメソッドは元のオブジェクトを変更するのではなく、計算結果の新しいBigDecimalを返します。そのため「total.add(amount);」と書いても何も起きません。必ず「total = total.add(amount);」と戻り値を変数に代入してください。
文字列コンストラクタ
またはvalueOf()
を使う
add/subtract/
multiply/divide
等のメソッドで
result = a.add(b)
戻り値を受け取る
(immutableのため)
compareTo()のみ使用
equals()や==は
使わない
toString()やDBへ
保存。必要なら
setScaleで桁数指定
07 CLAUDE CODE PRACTICE 【独自】Claude CodeでBigDecimal処理を即座に実装する 非エンジニアでも「指示するだけ」でJavaコードを生成できる
JavaのBigDecimalは正確に使うためのルールが多く、最初は覚えるのが大変です。Claude Codeを使えば、自然言語で指示するだけで正確なBigDecimalコードを生成できます。
7-1. Claude Codeに依頼できるBigDecimal関連タスク
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を活用した開発支援を提供しています。
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の使い方に問題はないか確認して」というコードレビューの使い方も非常に効果的です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




