У меня есть следующий код на 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?
Используйте _1 _ вместо equals()
:
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
Сравнение с константой BigDecimal
_ 5_ позволяет избежать создания new BigDecimal(0)
при каждом выполнении.
К вашему сведению, BigDecimal
также имеет константы BigDecimal.ONE
и BigDecimal.TEN
для вашего удобства.
Причина, по которой вы не можете использовать _ 10_ заключается в том, что учитывается масштаб:
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
==
сравнивает идентичность объекта - то есть, если это один и тот же объект, а не если две стороны имеют равное значение. В Java всегда используйте .equals()
для сравнения.
- person Bohemian♦; 20.05.2021
Кроме того, signum () может использоваться:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)
выкинет NPE
- person ACV; 06.04.2017
Есть константа, по которой вы можете проверить:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
и compareTo
не такое, как вы думаете. документы .oracle.com / javase / 1.5.0 / docs / api / java / math /.
- person nhahtdh; 31.08.2012
В качестве альтернативы, я думаю, стоит упомянуть, что поведение методов 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
, иначе вы получите неожиданный результат.
Обычно я использую следующее:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
Вы хотели бы использовать 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()
.
equals
и compareTo
не такое, как вы думаете. документы .oracle.com / javase / 1.5.0 / docs / api / java / math /.
- person nhahtdh; 31.08.2012
equals
принимает во внимание масштаб, а это не то, что мы здесь хотим.
- person nhahtdh; 31.08.2012
equals
следует использовать вместо compareTo()
. ОП не указывает, какой тип математики он использует, так что вы правы, лучше предоставить ему оба варианта.
- person NominSim; 31.08.2012
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, я бы не стал считать его интуитивно понятной конструкцией (как и операторы ==, ‹,>,‹ =,> =). Когда вы держите в голове миллион вещей (ну, семь вещей), тогда все, что вы можете уменьшить свою когнитивную нагрузку, - это хорошо. Итак, я создал несколько полезных функций для удобства:
public static boolean equalsZero(BigDecimal x) {
return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) >= 0);
}
Вот как их использовать:
System.out.println("Starting main Utils");
BigDecimal bigDecimal0 = new BigDecimal(00000.00);
BigDecimal bigDecimal2 = new BigDecimal(2);
BigDecimal bigDecimal4 = new BigDecimal(4);
BigDecimal bigDecimal20 = new BigDecimal(2.000);
System.out.println("Positive cases:");
System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
System.out.println("bigDecimal2=" + bigDecimal2 + " < bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " > bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
System.out.println("Negative cases:");
System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " < bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " > bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));
Результаты выглядят так:
Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 < bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 > bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 < bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 > bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
Просто хочу поделиться здесь некоторыми полезными расширениями для kotlin
fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0
Простой и лучший способ для вашего примера:
BigDecimal price;
if(BigDecimal.ZERO.compareTo(price) == 0){
//Returns TRUE
}
Существует статическая константа, которая представляет 0 < / а>:
BigDecimal.ZERO.equals(selectPrice)
Вам следует сделать это вместо:
selectPrice.equals(BigDecimal.ZERO)
во избежание случая, когда selectPrice
равно null
.
equals
и compareTo
не такое, как вы думаете. документы .oracle.com / javase / 1.5.0 / docs / api / java / math /.
- person nhahtdh; 31.08.2012