que - java bigdecimal bigdecimal
Cómo comprobar si la variable BigDecimal== 0 en java? (8)
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?
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:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
Por lo tanto, debe tener mucho cuidado con la escala en su variable someValue , de lo contrario obtendría un resultado inesperado.
Alternativamente, se puede usar signum() :
if (price.signum() == 0) {
return true;
}
Desearía usar equals () dado que son objetos, y utilizar la instancia CERO incorporada:
if(selectPrice.equals(BigDecimal.ZERO))
Tenga en cuenta que .equals() tiene en cuenta la escala, por lo tanto, a menos que selectPrice tenga la misma escala (0) que .ZERO , esto dará como .ZERO falso.
Para sacar escala de la ecuación por así decirlo:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
Debo señalar que para ciertas situaciones matemáticas, 0.00 != 0 , por lo que imagino que .equals() tiene en cuenta la escala. 0.00 da precisión al lugar de las centésimas, mientras que 0 no es tan preciso. Dependiendo de la situación, es posible que desee seguir con .equals() .
Hay una constante con la que puedes comparar:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Hay una constante estática que representa 0 :
BigDecimal.ZERO.equals(selectPrice)
Debe hacer esto en lugar de:
selectPrice.equals(BigDecimal.ZERO)
para evitar el caso donde selectPrice es null .
Use compareTo(BigDecimal.ZERO) lugar de equals() :
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
Comparando con la constante BigDecimal.ZERO evita tener que construir un new BigDecimal(0) cada ejecución.
FYI, BigDecimal también tiene las constantes BigDecimal.ONE y BigDecimal.TEN para su conveniencia.
¡Nota!
La razón por la que no puede usar BigDecimal#equals() es que toma en consideración la escala :
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
por lo tanto, no es adecuado para una comparación puramente numérica. Sin embargo, BigDecimal.compareTo() no tiene en cuenta la escala al comparar:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Usualmente uso lo siguiente:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));