web-dev-qa-db-ja.com

BigDecimal equals()vs compareTo()

簡単なテストクラスを考えてみましょう。

import Java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}

(意識的に)xy(オブジェクト参照ではない)と等しいと言えますが、プログラムを実行すると、次の結果が表示されます。

false
true

質問:BigDecimalcompareToxと等しいと判断できるycompareTo()equals()の違いは何ですか?

PS:BigDecimalにはinflate()メソッドにequals()メソッドがあります。 inflate()は実際に何をしますか?

139
Buhake Sindi

答えは equals()メソッドのJavaDoc にあります:

compareTo とは異なり、このメソッドは、値とスケールが等しい場合にのみ2つのBigDecimalオブジェクトが等しいと見なします(このメソッドで比較した場合、2.0は2.00と等しくありません)。

言い換えると、equals()は、BigDecimalオブジェクトがexactlyeveryアスペクト。 compareTo() "only"は、数値を比較します。

196
Joachim Sauer

BigDecimalには、equals()メソッドにinflate()メソッドがあることがわかります。 inflate()は実際に何をしますか?

基本的に、inflate()は必要に応じてBigInteger.valueOf(intCompact)を呼び出します。つまり、long intCompactからBigIntegerとして保存されるスケーリングされていない値を作成します。 BigIntegerが不要で、スケールなしの値がlongBigDecimalに収まる場合は、できるだけスペースを節約しようとするようです。

1
Thomas