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
BigDecimalconstanteBigDecimal.ZEROevita tener que construirnew BigDecimal(0)cada ejecución.Para su información,
BigDecimaltambién tiene constantesBigDecimal.ONEyBigDecimal.TENpara 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
equalsycompareTono 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
someValuevariable, 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.ZEROesto devolverá falso.Para eliminar la escala de la ecuación, por así decirlo:
Debo señalar que para ciertas situaciones matemáticas,
0.00 != 0es por eso que imagino que.equals()toma en cuenta la escala.0.00da precisión al lugar de las centésimas, mientras0que no es tan preciso. Dependiendo de la situación con la que quiera quedarse.equals().fuente
equalsycompareTono es como piensas. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equalstiene en cuenta la escala, que no es lo que queremos aquí.equalsdeberí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
selectPriceestánull.fuente
equalsycompareTono es como piensas. docs.oracle.com/javase/1.5.0/docs/api/java/math/…