У меня есть следующий код на Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Как лучше написать условие if?
java
bigdecimal
JoJo
источник
источник
Ответы:
Используйте
compareTo(BigDecimal.ZERO)
вместоequals()
:Сравнение с
BigDecimal
константойBigDecimal.ZERO
позволяет избежать необходимости создаватьnew BigDecimal(0)
каждое выполнение.К вашему сведению,
BigDecimal
также есть константыBigDecimal.ONE
иBigDecimal.TEN
для вашего удобства.Заметка!
Причина, по которой вы не можете использовать
BigDecimal#equals()
это то, что учитывает масштаб :поэтому он не подходит для чисто числового сравнения. Тем
BigDecimal.compareTo()
не менее, не учитывает масштаб при сравнении:источник
В качестве альтернативы, signum () можно использовать:
источник
BigDecimal.ZERO.compareTo(null)
бросит NPEСуществует константа, с которой вы можете проверить:
источник
equals
иcompareTo
не так, как вы думаете. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Я обычно использую следующее:
источник
В качестве альтернативы, я думаю, стоит упомянуть, что поведение методов equals и compareTo в классе BigDecimal не соответствуют друг другу .
Это в основном означает, что:
Поэтому вы должны быть очень осторожны со шкалой в вашей
someValue
переменной, иначе вы получите неожиданный результат.источник
Вы хотели бы использовать equals (), так как они являются объектами, и использовать встроенный экземпляр ZERO:
Обратите внимание, что
.equals()
учитывается масштаб, поэтому, если selectPrice не имеет такой же масштаб (0), как.ZERO
тогда, он вернет false.Чтобы вывести масштаб из уравнения как бы:
Я должен отметить, что для определенных математических ситуаций
0.00 != 0
, поэтому я предполагаю, что.equals()
учитывает масштаб.0.00
дает точность до сотого места, а0
не так точно. В зависимости от ситуации вы можете придерживаться.equals()
.источник
equals
иcompareTo
не так, как вы думаете. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
учитывает масштаб, а это не то, что мы хотим здесь.equals
следует использовать вместоcompareTo()
. ОП не указывает, какой тип математики он использует, поэтому вы правы, лучше дать ему оба варианта.GriffeyDog определенно прав:
Код:
Полученные результаты:
Хотя я понимаю преимущества сравнения BigDecimal, я бы не стал рассматривать его как интуитивную конструкцию (как это делают операторы ==, <,>, <=,> =). Когда вы держите в своей голове миллион вещей (хорошо, семь вещей), тогда все, что вы можете уменьшить когнитивную нагрузку, - это хорошо. Поэтому я построил несколько полезных вспомогательных функций:
Вот как их использовать:
Результаты выглядят так:
источник
Просто хочу поделиться здесь некоторыми полезными расширениями для kotlin
источник
источник
Есть статическая константа, которая представляет 0 :
Вы должны сделать это вместо:
во избежание того случая, когда
selectPrice
естьnull
.источник
equals
иcompareTo
не так, как вы думаете. docs.oracle.com/javase/1.5.0/docs/api/java/math/…