BigDecimalで比較を行う場合の注意点【”0″と”0.0″は別?】

プログラム
スポンサーリンク

アフィリエイト広告を利用しています

現在参画しているプロジェクトでBigDecimalでの値比較であるequalsとcompareToの仕様の違いで不具合が発生していました。

備忘録としてここにまとめます。

まずは以下のプログラムを実行してみてください。

import java.math.BigDecimal;

public class BigIntegerTest {
	public static void main(String[] args) {
		var zero1 = new BigDecimal("0");
		var zero2 = new BigDecimal("0.0");
		
		System.out.println(zero1.compareTo(zero2) == 0); // true
		
		System.out.println(zero1.equals(zero2)); // false
	}
}

zero1とzero2、どちらも数値としては0を意味しています。

しかし、コメントに書いた通りcompareToでは同じものとして扱われ、equalsではfalseを返します。

compareToは数値的な意味での比較を行うのですが、equalsではスケールを含めた比較をするのです。

どちらもケースバイケースで使うことになるでしょう。しかし、数値として利用することが多いでしょうから、基本的な選択としてはcompareToにしたほうが無難なはずです。

MENTAプラン紹介
フリーランスITエンジニアに関する相談にのります

フリーランスITエンジニアになりたい、けれど不安があるという方向けの相談サービスです。

長期ブランクという苦境を乗り越えてフリーランスとして独立した私、土谷俊介があなたの不安を取り除きます。

プログラム
スポンサーリンク
土谷 俊介をフォローする

コメント

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