У меня есть следующий код в Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Каков наилучший способ записать условие if?
У меня есть следующий код в Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Каков наилучший способ записать условие if?
Используйте 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
В качестве альтернативы можно использовать signum():
if (price.signum() == 0) {
return true;
}
Существует константа, которую вы можете проверить:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Обычно я использую следующее:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
В качестве альтернативы, я думаю, стоит упомянуть, что методы 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
, иначе вы получите неожиданный результат.
Вы хотите использовать 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()
.
Просто хочу поделиться здесь некоторыми полезными расширениями для kotlin
fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0
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
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
Существует статическая константа, которая представляет 0:
BigDecimal.ZERO.equals(selectPrice)
Вы должны сделать это, а не:
selectPrice.equals(BigDecimal.ZERO)
чтобы избежать случая, когда selectPrice
равно null
.