簡単なテストクラスを考えてみましょう。
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
質問:BigDecimal
がcompareTo
がx
と等しいと判断できるy
のcompareTo()
とequals()
の違いは何ですか?
PS:BigDecimalにはinflate()
メソッドにequals()
メソッドがあります。 inflate()
は実際に何をしますか?
答えは equals()
メソッドのJavaDoc にあります:
compareTo
とは異なり、このメソッドは、値とスケールが等しい場合にのみ2つのBigDecimal
オブジェクトが等しいと見なします(このメソッドで比較した場合、2.0は2.00と等しくありません)。
言い換えると、equals()
は、BigDecimal
オブジェクトがexactlyでeveryアスペクト。 compareTo()
"only"は、数値を比較します。
BigDecimalには、equals()メソッドにinflate()メソッドがあることがわかります。 inflate()は実際に何をしますか?
基本的に、inflate()
は必要に応じてBigInteger.valueOf(intCompact)
を呼び出します。つまり、long intCompact
からBigInteger
として保存されるスケーリングされていない値を作成します。 BigInteger
が不要で、スケールなしの値がlong
BigDecimal
に収まる場合は、できるだけスペースを節約しようとするようです。