現在参画しているプロジェクトで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にしたほうが無難なはずです。
コメント