BigDecimalの罠

BigDecimal型のオブジェクトであるvalueの値がゼロか否かで処理を分けようとして以下のようなコードを書いたらうまく動かなかった。

if( BigDecimal.valueOf( 0 ).equals( value ) )

BigDecimalのequalsはスケールの値もオブジェクトが等しいかどうかの判断に使われるということに気づいていなかったのが罠でした。
数値としてだけ見た場合は等しくとも、BigDecimal.valueOf( 0 )のスケールは0なのに対してvalueは0では無かったため、equalsメソッドがfalseを返してしまいました。
オブジェクトが表現しているものが等しいかどうかを調べると考えれば、スケール値も比較対象となるのは自然なので、equalsメソッドの動作は納得。
で、実際に値が0か否かを調べるにはcompareToを使用して以下のようにしました。

if( BigDecimal.valueOf( 0 ).compareTo( value )==0 )

Java標準のクラスの動作で、久々にはまりそうになったかも。