web-dev-qa-db-ja.com

Javaのゼロ(BigDecimal / Double)の等号演算子

いくつかの興味深い観察w.r.tは、0と0.0の演算子に等しい

  1. new Double(0.0).equals(0)はfalseを返し、new Double(0.0).equals(0.0)はtrueを返します。

  2. BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))はfalseを返し、BigDecimal.ZERO.equals(BigDecimal.valueOf(0))はtrueを返します。

両方のケースで文字列の比較が行われているように見えます。誰もこれにいくつかの光を投げることができます。

ありがとう。

34
Manish Mulani

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です。

64
assylias
  1. 最初の式の0は、intとしてではなく、Integerに自動ボックス化されるDoubleとして解釈されます。したがって、2つのタイプは異なるため、等しくありません。オトー0.0doubleであり、Doubleに自動ボックス化されるため、2つのオペランドは等しいと見なされます。

  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
    
5
Péter Török
new Double(0.0).equals(0); //false

渡された引数は整数であるため。 equels() in Doubleクラスは、引数がod instance Doubleであるかどうかをチェックします- インスタンス演算子。

Doubleequals()メソッド。

if (!(argument instanceof Double))
  return false;

渡された引数はintegerです。これはDoubleのインスタンスではないため、falseを返します。

1
Chandra Sekhar

new Double(0.0).equals(0)は、実際には次のようにボックス化されています。

new Double(0.0).equals(Integer.valueOf(0))

Double.equals(...)は、別のDoubleインスタンスが与えられない限り、決してtrueを返しません。

1
Adam
new Double(0.0).equals(0)

この行は、0のdouble値(厳密にはゼロではない)と0の整数を比較します。

BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))

BigDecimalは、等号演算でスケールの長さを比較します。

0
TheOutsider

パフォーマンスを考慮して、BigDecimal、BigDecimal(小数部なし)の場合、BigIntegerは0〜15の小さい値をキャッシュします。

BigDecimal.ZEROは新しいBigDecimal(BigInteger.ZERO、0、0、1)であり、valueOfメソッドは通常、キャッシュから0〜15を取得します:)

0
Anish Dasappan
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");
} 
0
Agassis