いくつかの興味深い観察w.r.tは、0と0.0の演算子に等しい
new Double(0.0).equals(0)
はfalseを返し、new Double(0.0).equals(0.0)
はtrueを返します。
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
はfalseを返し、BigDecimal.ZERO.equals(BigDecimal.valueOf(0))
はtrueを返します。
両方のケースで文字列の比較が行われているように見えます。誰もこれにいくつかの光を投げることができます。
ありがとう。
BigDecimal 'equals'は、値とスケールを比較します。値(0 == 0.0)のみを比較する場合は、compareToを使用する必要があります。
_BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true
_
javadoc を参照してください。
Double比較については、他の回答で説明されているように、Doubleをnew Double(0.0).equals(0)
の整数と比較しています。これは、オブジェクトのタイプが異なるためfalse
を返します。参考までに、 JDK 7のequalsメソッドのコード は次のとおりです。
_public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
_
あなたの場合、_(obj instanceof Double)
_はfalseです。
最初の式の0は、int
としてではなく、Integer
に自動ボックス化されるDouble
として解釈されます。したがって、2つのタイプは異なるため、等しくありません。オトー0.0
はdouble
であり、Double
に自動ボックス化されるため、2つのオペランドは等しいと見なされます。
BigDecimalsには、スケール(つまり、小数点区切りドットの右側の桁数)も含まれています。 BigDecimal.ZERO
の値は「0」であるため、スケールは0です。したがって、スケールが「0.0」ではなく、スケールは1です。
値を比較する場合は、 BigDecimal.compareTo
:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
new Double(0.0).equals(0); //false
渡された引数は整数であるため。 equels() in Doubleクラスは、引数がod instance Doubleであるかどうかをチェックします- インスタンス演算子。
Doubleのequals()メソッド。
if (!(argument instanceof Double))
return false;
渡された引数はintegerです。これはDoubleのインスタンスではないため、falseを返します。
new Double(0.0).equals(0)は、実際には次のようにボックス化されています。
new Double(0.0).equals(Integer.valueOf(0))
Double.equals(...)は、別のDoubleインスタンスが与えられない限り、決してtrueを返しません。
new Double(0.0).equals(0)
この行は、0のdouble値(厳密にはゼロではない)と0の整数を比較します。
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
BigDecimalは、等号演算でスケールの長さを比較します。
パフォーマンスを考慮して、BigDecimal、BigDecimal(小数部なし)の場合、BigIntegerは0〜15の小さい値をキャッシュします。
BigDecimal.ZEROは新しいBigDecimal(BigInteger.ZERO、0、0、1)であり、valueOfメソッドは通常、キャッシュから0〜15を取得します:)
please try doublevalue instead of compareto if you feel is not as beautiful and readable as or simply need an alternative like below:
BigDecimal a = new BigDecimal("0.00");
BigDecimal b = new BigDecimal("0.0");
BigDecimal c = new BigDecimal("0");
if(a.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("a equals");
}
if(b.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("b equals");
}
if(c.doubleValue()==BigDecimal.ZERO.doubleValue()) {
System.out.println("c equals");
}