Tengo una clase de dominio con unitPrice establecido como tipo de datos BigDecimal. Ahora estoy tratando de crear un método para comparar el precio, pero parece que no puedo tener operadores de comparación en el tipo de datos BigDecimal. ¿Tengo que cambiar el tipo de datos o hay otra forma?
java
operator-keyword
bigdecimal
user3127109
fuente
fuente
BigDecimal
es unObject
, no, esto no funciona. Pero simplemente podría restar uno de otro y verificar si el valor resultante es<0
,==0
o>0
. De lo contrario, podría seguir el camino estándar con los métodos proporcionados por BigDecimalcompareTo
método que devuelve -1, 0 o 1. Que es básicamente elComparable
.Respuestas:
Cada objeto de la clase
BigDecimal
tiene un métodocompareTo
que puede usar para compararlo con otro BigDecimal.compareTo
Luego se compara el resultado de> 0
,== 0
o< 0
dependiendo de lo que necesite. Lea la documentación y lo averiguará.Los operadores
==
,<
,>
y así sucesivamente sólo pueden utilizarse en los tipos de datos primitivos comoint
,long
,double
o sus clases de envoltura comoInteger
yDouble
.De la documentación de
compareTo
:fuente
a.compareTo(b)
devuelve un número mayor que cero sia > b
,0
sia == b
y menor que cero sia < b
.Para ser breve:
fuente
Utilice el
compareTo
método de BigDecimal:fuente
Puede utilizar el método llamado
compareTo
,x.compareTo(y)
. Devolverá 0 si xey son iguales, 1 si x es mayor que y y -1 si x es menor que yfuente
Aquí hay un ejemplo para los seis operadores de comparación booleanos (<, ==,>,> =,! =, <=):
fuente
BigDecimal
No es una primitiva, por lo que no puede utilizar los<
,>
operadores. Sin embargo, dado que es unComparable
, puede usar elcompareTo(BigDecimal)
para el mismo efecto. P.ej:fuente
Utilizando la clase de utilidad com.ibm.etools.marshall.util.BigDecimalRange de IBM, se puede comparar si BigDecimal está en el rango.
fuente
Este hilo tiene muchas respuestas que indican que el método BigDecimal.compareTo (BigDecimal) es el que se usa para comparar instancias de BigDecimal . Solo quería agregar que ya no tenga experiencia con el uso del método BigDecimal.compareTo (BigDecimal) para tener cuidado con la forma en que está creando sus instancias BigDecimal . Así por ejemplo...
new BigDecimal(0.8)
creará unaBigDecimal
instancia con un valor que no es exactamente0.8
y que tiene una escala de 50+,new BigDecimal("0.8")
creará unaBigDecimal
instancia con un valor que es exactamente0.8
y que tiene una escala de 1... y los dos se considerarán desiguales según el método BigDecimal.compareTo (BigDecimal) porque sus valores son desiguales cuando la escala no se limita a unos pocos decimales.
En primer lugar, tenga cuidado de crear sus
BigDecimal
instancias con elBigDecimal(String val)
constructor o elBigDecimal.valueOf(double val)
método en lugar delBigDecimal(double val)
constructor. En segundo lugar, tenga en cuenta que puede limitar la escala de las instancias de BigDecimal antes de compararlas mediante el método BigDecimal.setScale (int newScale, RoundingMode roundingMode) .fuente