178

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

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");
    }

}

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

false
true

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

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

4

4 に答える 4

259

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

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

つまり、オブジェクトがすべての面でまったく同じequals()かどうかを確認します。「のみ」はそれらの数値を比較します。BigDecimalcompareTo()

がこのように動作する理由については 、この SO question で回答されています。equals()

于 2011-07-22T07:59:04.443 に答える
1

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

基本的に、必要に応じてinflate()呼び出しますBigInteger.valueOf(intCompact)。つまり、BigIntegerfromとして格納されるスケーリングされていない値を作成しlong intCompactます。それが必要なくBigInteger、スケーリングされていない値が a に収まる場合はlong BigDecimal、可能な限りスペースを節約しようとするようです。

于 2011-07-22T08:18:51.727 に答える