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にしたほうが無難なはずです。

おすすめ記事

コメント

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