Eu tenho o seguinte código em Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Qual é a melhor maneira de escrever a condição if?
java
bigdecimal
JoJo
fonte
fonte
Respostas:
Use em
compareTo(BigDecimal.ZERO)
vez deequals()
:Comparando com a
BigDecimal
constanteBigDecimal.ZERO
evita ter que construirnew BigDecimal(0)
cada execução.Para sua informação,
BigDecimal
também tem constantesBigDecimal.ONE
eBigDecimal.TEN
para sua conveniência.Nota!
A razão pela qual você não pode usar
BigDecimal#equals()
é que ela leva em consideração a escala :portanto, não é adequado para uma comparação puramente numérica. No entanto,
BigDecimal.compareTo()
não considera escala ao comparar:fonte
Como alternativa, signum () pode ser usado:
fonte
BigDecimal.ZERO.compareTo(null)
lançará NPEHá uma constante que você pode verificar:
fonte
equals
ecompareTo
não é o que você pensa. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Eu costumo usar o seguinte:
fonte
Como alternativa, acho que vale a pena mencionar que o comportamento dos métodos igual e compareTo na classe BigDecimal não são consistentes entre si .
Isso basicamente significa que:
Portanto, você deve ter muito cuidado com a escala em sua
someValue
variável, caso contrário, obterá um resultado inesperado.fonte
Você deseja usar equals (), pois eles são objetos, e utilizar a instância ZERO integrada:
Observe que
.equals()
leva em consideração a escala, portanto, a menos que selectPrice seja a mesma escala (0).ZERO
, isso retornará false.Para tirar a escala da equação, por assim dizer:
Devo observar que, para certas situações matemáticas
0.00 != 0
, é por isso que imagino.equals()
leva em conta a escala.0.00
dá precisão ao centésimo lugar, enquanto0
que não é tão preciso. Dependendo da situação que você pode querer manter.equals()
.fonte
equals
ecompareTo
não é o que você pensa. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
leva em conta a escala, que não é o que queremos aqui.equals
deve ser usado em vez decompareTo()
. O OP não especifica que tipo de matemática ele está usando, então você está certo, é melhor dar a ele as duas opções.GriffeyDog está definitivamente correto:
Código:
Resultados:
Embora eu compreenda as vantagens da comparação BigDecimal, não consideraria uma construção intuitiva (como os operadores ==, <,>, <=,> = são). Quando você está segurando um milhão de coisas (ok, sete coisas) em sua cabeça, qualquer coisa que possa reduzir sua carga cognitiva é uma coisa boa. Então, eu criei algumas funções úteis de conveniência:
Aqui está como usá-los:
Os resultados são assim:
fonte
Só quero compartilhar aqui algumas extensões úteis para o kotlin
fonte
fonte
Há uma constante estática que representa 0 :
Você deve fazer isso em vez de:
para evitar o caso onde
selectPrice
estánull
.fonte
equals
ecompareTo
não é o que você pensa. docs.oracle.com/javase/1.5.0/docs/api/java/math/…