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"));