Tengo el siguiente código en Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
¿Cuál es la mejor manera de escribir la condición if?
java
bigdecimal
JoJo
fuente
fuente
Respuestas:
Usar en
compareTo(BigDecimal.ZERO)
lugar deequals()
:La comparación con la
BigDecimal
constanteBigDecimal.ZERO
evita tener que construirnew BigDecimal(0)
cada ejecución.Para su información,
BigDecimal
también tiene constantesBigDecimal.ONE
yBigDecimal.TEN
para su conveniencia.¡Nota!
La razón por la que no puede usar
BigDecimal#equals()
es que tiene en cuenta la escala :por lo tanto, no es adecuado para una comparación puramente numérica. Sin embargo,
BigDecimal.compareTo()
no considera la escala al comparar:fuente
Alternativamente, se puede usar signum () :
fuente
BigDecimal.ZERO.compareTo(null)
lanzará NPEHay una constante con la que puede verificar:
fuente
equals
ycompareTo
no es como piensas. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Usualmente uso lo siguiente:
fuente
Alternativamente, creo que vale la pena mencionar que el comportamiento de los métodos equals y compareTo en la clase BigDecimal no son consistentes entre sí .
Esto básicamente significa que:
Por lo tanto, debe tener mucho cuidado con la escala en su
someValue
variable, de lo contrario obtendría un resultado inesperado.fuente
Debería usar equals () ya que son objetos y utilizar la instancia CERO incorporada:
Tenga
.equals()
en cuenta que tiene en cuenta la escala, por lo que, a menos que selectPrice sea la misma escala (0) que.ZERO
esto devolverá falso.Para eliminar la escala de la ecuación, por así decirlo:
Debo señalar que para ciertas situaciones matemáticas,
0.00 != 0
es por eso que imagino que.equals()
toma en cuenta la escala.0.00
da precisión al lugar de las centésimas, mientras0
que no es tan preciso. Dependiendo de la situación con la que quiera quedarse.equals()
.fuente
equals
ycompareTo
no es como piensas. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
tiene en cuenta la escala, que no es lo que queremos aquí.equals
debería usarse en lugar decompareTo()
. El OP no especifica qué tipo de matemática está usando, por lo que tiene razón, es mejor darle ambas opciones.GriffeyDog es definitivamente correcto:
Código:
Resultados:
Si bien entiendo las ventajas de la comparación BigDecimal, no lo consideraría una construcción intuitiva (como los operadores ==, <,>, <=,> =). Cuando tienes un millón de cosas (bueno, siete cosas) en tu cabeza, cualquier cosa que puedas reducir tu carga cognitiva es algo bueno. Así que construí algunas funciones útiles de conveniencia:
Aquí está cómo usarlos:
Los resultados se ven así:
fuente
Solo quiero compartir aquí algunas extensiones útiles para kotlin
fuente
fuente
Hay una constante estática que representa 0 :
Deberías hacer esto en lugar de:
para evitar el caso donde
selectPrice
estánull
.fuente
equals
ycompareTo
no es como piensas. docs.oracle.com/javase/1.5.0/docs/api/java/math/…