Как проверить, является ли BigDecimal variable == 0 в java?

У меня есть следующий код в Java;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

Каков наилучший способ записать условие if?

Ответ 1

Используйте compareTo(BigDecimal.ZERO) вместо equals()

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

Сравнение с BigDecimal константа BigDecimal.ZERO избегает необходимости создавать new BigDecimal(0) каждое выполнение.

FYI, BigDecimal также имеет константы BigDecimal.ONE и BigDecimal.TEN для вашего удобства.


Внимание!

Причина, по которой вы не можете использовать BigDecimal#equals(), состоит в том, что она учитывает масштаб:

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

поэтому он непригоден для чисто числового сравнения. Однако BigDecimal.compareTo() не учитывает масштаб при сравнении:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

Ответ 2

В качестве альтернативы можно использовать signum():

if (price.signum() == 0) {
    return true;
}

Ответ 3

Существует константа, которую вы можете проверить:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0

Ответ 4

Обычно я использую следующее:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

Ответ 5

В качестве альтернативы, я думаю, стоит упомянуть, что методы equals и compareTo в классе BigDecimal не согласуются друг с другом.

Это в основном означает, что:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

Следовательно, вы должны быть очень осторожны с масштабом в переменной someValue, иначе вы получите неожиданный результат.

Ответ 6

Вы хотите использовать equals(), поскольку они являются объектами, и использовать встроенный экземпляр ZERO:

if(selectPrice.equals(BigDecimal.ZERO))

Обратите внимание, что .equals() учитывает масштаб, поэтому, если selectPrice - это тот же масштаб (0), что и .ZERO, тогда это вернет false.

Извлечь масштаб из уравнения:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

Следует отметить, что для некоторых математических ситуаций 0.00 != 0, поэтому я полагаю, что .equals() учитывает масштаб. 0.00 дает точность в сотых местах, тогда как 0 не так точен. В зависимости от ситуации вы можете придерживаться .equals().

Ответ 7

Просто хочу поделиться здесь некоторыми полезными расширениями для kotlin

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

Ответ 8

GriffeyDog определенно прав:

Код:

BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));

Результаты:

myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
 equals=false
compare=true

Ответ 9

BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));

Ответ 10

Существует статическая константа, которая представляет 0:

BigDecimal.ZERO.equals(selectPrice)

Вы должны сделать это, а не:

selectPrice.equals(BigDecimal.ZERO)

чтобы избежать случая, когда selectPrice равно null.