Подтвердить что ты не робот

Оператор Equals для нулей (BigDecimal/Double) в Java

Несколько интересных наблюдений 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.

Похоже, что сравнение строк выполняется в обоих случаях. Может ли кто-нибудь пролить свет на это.

Спасибо.

4b9b3361

Ответ 1

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 с Integer в new Double(0.0).equals(0), который возвращает false, потому что объекты имеют разные типы. Для справки, код для метода equals в JDK 7:

public boolean equals(Object obj) {
    return (obj instanceof Double)
           && (doubleToLongBits(((Double)obj).value) ==
                  doubleToLongBits(value));
}

В вашем случае (obj instanceof Double) имеет значение false.

Ответ 2

  • 0 в вашем первом выражении интерпретируется как int, который может быть автобоксирован в Integer, но не в Double. Таким образом, тип двух разных, следовательно, они не равны. OTOH 0.0 является Double, который автобоксируется в Double, поэтому оба операнда считаются равными.

  • 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
    

Ответ 3

new Double(0.0).equals(0); //false

поскольку аргумент, который вы передали, является целым числом. и equels() в классе Double проверяет, является ли аргумент od экземпляром od Double или не используется экземпляр оператора.

Метод Двойной equals().

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

Аргумент, который вы передали, целое, который не является экземпляром Double, поэтому он возвращает false.

Ответ 4

new Double (0.0).equals(0) на самом деле помещается как-то так:

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

Double.equals(...) никогда не вернет true, если не задан другой экземпляр Double.

Ответ 5

new Double(0.0).equals(0)

В этой строке сравнивается двойное значение 0 (которое не является точным нолем) с целым числом 0.

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

BigDecimal будет сравнивать длину шкалы в операции равенства.

Ответ 6

Для соображений производительности BigDecimal BigInteger кэширует небольшие значения 0 до 15 в случае BigDecimal (без фракций)

BigDecimal.ZERO будет новым BigDecimal (BigInteger.ZERO, 0, 0, 1) & Амп; метод valueOf обычно выбирает из кеша с 0 по 15:)

Ответ 7

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