MEDIA

メディア

  1. TOP
  2. メディア
  3. プログラミング
  4. Java BigDecimal完全ガイド|誤差ゼロ計算を実務目線で徹底解説

Java BigDecimal完全ガイド|誤差ゼロ計算を実務目線で徹底解説

BigDecimalとは?なぜ実務で必須なのか

Javaを学び始めると、数値計算にはintdoubleを使う場面が多いでしょう。

しかし実務、とくに業務システムや金融系では、それだけでは不十分です。

「計算結果が1円ずれる」

それだけで、システムは信用を失います。

その問題を根本から防ぐために使われるのがBigDecimalです。

BigDecimalの基本概念

BigDecimalは、任意精度の10進数を扱えるJava標準クラスです。

特徴は以下の通りです。

  • 10進数ベースで数値を管理
  • 小数点以下の誤差を極限まで排除
  • 不変(immutable)オブジェクト

不変オブジェクトであるため、

計算のたびに新しいインスタンスが生成されます。

これは一見不便ですが、意図しない値変更を防げるという大きなメリットがあります。

金融・業務システムで使われる理由

例えば次の計算を考えてみてください。

double result = 0.1 + 0.2;
System.out.println(result); // 0.30000000000000004

一見するとバグに見えますが、これは2進数表現による誤差が原因です。

BigDecimalならどうでしょう。

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 0.3

この違いが、請求金額・税計算・残高管理で致命的な差を生みます。

double・floatとの決定的な違い

項目 double / float BigDecimal
精度 低い 非常に高い
演算速度 高速 遅め
誤差 発生する 原則発生しない
実務適性

実務では「正確性」が最優先です。そのためBigDecimalが選ばれます。

BigDecimalの初期化と基本操作

BigDecimalは「使い方」を間違えると、

誤差をそのまま引き継いでしまう点に注意が必要です。

安全な初期化方法(String推奨)

もっとも安全なのはStringコンストラクタです。

BigDecimal price = new BigDecimal("100.50");

避けるべき例はこちら。

BigDecimal price = new BigDecimal(0.1); // 非推奨

理由は、doubleの誤差をそのまま持ち込むからです。

四則演算の基本メソッド

BigDecimalは演算子が使えません。

すべてメソッドで処理します。

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
a.add(b); // 加算
a.subtract(b); // 減算
a.multiply(b); // 乗算
a.divide(b); // 除算

この制約が、逆に誤操作を防ぐ安全装置になります。

valueOfとの使い分け

BigDecimal value = BigDecimal.valueOf(100);
  • int・long → 安全
  • double → 完全ではない

原則:業務値はStringで生成

これを覚えておくと実務で困りません。

丸め処理(RoundingMode)の実務知識

BigDecimalで最もトラブルが起きやすいのが丸め処理です。

setScaleの役割

BigDecimal value = 
 new BigDecimal("100.125")
  .setScale(2, RoundingMode.HALF_UP);

結果は「100.13」。

スケールを指定しないと、例外が発生するケースもあります。

代表的なRoundingMode一覧

モード 内容
HALF_UP 四捨五入
HALF_DOWN 五捨六入
HALF_EVEN 銀行丸め
CEILING 常に切り上げ
FLOOR 常に切り捨て

金融系では

HALF_UP or HALF_EVENが主流です。

丸め処理の設計ポイント

  • ハードコーディングしない
  • 定数 or 設定ファイルで管理
  • テストケースに必ず含める

BigDecimalの比較方法と落とし穴

BigDecimalの比較は罠が多いです。

compareToの正しい使い方

a.compareTo(b) == 0 // 等しい
a.compareTo(b) > 0 // aが大きい
a.compareTo(b) < 0 // aが小さい

業務ロジックではcompareToが基本です。

equalsが危険な理由

BigDecimal("1.0")
 .equals(new BigDecimal("1.00")); // false

スケールまで比較されるため、数値的に同じでもfalseになります。

型変換・ループ処理・注意点

型変換の実例

BigDecimal bd = new BigDecimal("100");
int i bd = bd.intValueExact(); // 安全

不正な変換時は例外が出るため、バグの早期発見につながります。

for文・foreachでの実践例

for文
BigDecimal total = BigDecimal.ZERO;
for (BigDecimal price : prices) {
 total = total.add(price);
}

注意点:

  • 毎回新しいインスタンスが生成される
  • 大量ループではパフォーマンス検証必須
  • doubleを入口にしない

    for文の基本構文から実務での使いどころまで詳しく知りたい方は、

    👉 Javaのfor文を基礎から実務レベルまで解説したこちらの記事 を参考にしてください。

    foreach
    List<BigDecimal> prices = List.of(
     new BigDecimal("1200.50"),
     new BigDecimal("800.25"),
     new BigDecimal("499.25")
    );
    
    BigDecimal total = BigDecimal.ZERO;
    
    prices.forEach(price -> {
     total = total.add(price);
    });
    
    System.out.println(total); // 2500.00

    注意点:

    • 途中で処理を止められない(foreachでは breakcontinue が使えない)
    • 条件分岐が複雑な場合はfor文の方が適切

    foreachの基本構文や、for文・Streamとの使い分けについて詳しく知りたい方は、

    👉 Javaのforeachを完全理解するための解説記事 をあわせて読んでみてください。

    ここまで読んで、「実務ではこういうコードを書くのか」とイメージできた方も多いのではないでしょうか。

    ただ、BigDecimalやforeachのような知識は、単体で学ぶよりも「実際の業務を想定しながら」学ぶことで一気に定着します。

    もし、

    • Javaを使った実務レベルのコードを書けるようになりたい
    • 未経験からエンジニア転職を目指している
    • 独学でつまずいてしまっている

    という方には、完全無料で学べるプログラミングオンラインスクール「ZeroCodeがおすすめです。

    ZeroCodeでは、Javaの基礎だけでなく、現場で求められる書き方・考え方・実装例を重視した学習が可能です。

    さらに、希望者には就職・転職サポートも用意されているため、未経験からエンジニアを目指す方にも最適な環境が整っています。

    「コードが書ける」だけで終わらせず、

    「現場で通用する力」を身につけたい方は、ぜひ一度チェックしてみてください。

    BigDecimalを理解しよう!

    BigDecimalは単なるクラスではありません。「実務を理解している証明」です。

    • 正確な数値計算ができる
    • 業務ロジックを意識している
    • バグを未然に防げる

    これらは、

    未経験からの転職・新卒採用で強い評価ポイントになります。

    基礎文法の次に、ぜひBigDecimalを「使える知識」にしてください。

    Join us! 未経験からエンジニアに挑戦できる環境で自分の可能性を信じてみよう 採用ページを見る→

    記事監修

    ドライブライン編集部

    [ この記事をシェアする ]

    記事一覧へ戻る