Cómo usar operadores de comparación como>, =, <en BigDecimal

103

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?

user3127109
fuente
ya que BigDecimales un Object, no, esto no funciona. Pero simplemente podría restar uno de otro y verificar si el valor resultante es <0, ==0o >0. De lo contrario, podría seguir el camino estándar con los métodos proporcionados por BigDecimal
SomeJavaGuy
2
Por eso hay un compareTométodo que devuelve -1, 0 o 1. Que es básicamente el Comparable.
M. Deinum

Respuestas:

113

Cada objeto de la clase BigDecimaltiene un método compareToque puede usar para compararlo con otro BigDecimal. compareToLuego se compara el resultado de > 0, == 0o < 0dependiendo 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 como int, long, doubleo sus clases de envoltura como Integery Double.

De la documentación de compareTo:

Compara esto BigDecimalcon el especificado BigDecimal.

Dos BigDecimal objetos que tienen el mismo valor pero tienen una escala diferente (como 2.0 y 2.00) se consideran iguales con este método. Este método se proporciona con preferencia a los métodos individuales para cada uno de los seis operadores de comparación booleanos (<, ==,>,> =,! =, <=). El idioma sugerido para realizar estas comparaciones es:, (x.compareTo(y) <op> 0)donde <op> es uno de los seis operadores de comparación.

Devuelve: -1, 0 o 1 ya que este BigDecimal es numéricamente menor, igual o mayor que val.

Simulante
fuente
1
Pero, ¿el método compareTo ayuda a determinar si el precio es mayor, igual o menor que?
user3127109
2
Si. Esa información está en el enlace que se proporciona en la respuesta.
Drew Kennedy
4
@ user3127109 yes, a.compareTo(b)devuelve un número mayor que cero si a > b, 0si a == by menor que cero si a < b.
Zoltán
119

Para ser breve:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
torina
fuente
22

Utilice el compareTométodo de BigDecimal:

public int compareTo (BigDecimal val) Compara este BigDecimal con el BigDecimal especificado.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
Arnaud
fuente
12

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 y

Agung Setiawan
fuente
11

Aquí hay un ejemplo para los seis operadores de comparación booleanos (<, ==,>,> =,! =, <=):

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true
ognjenkl
fuente
5

BigDecimalNo es una primitiva, por lo que no puede utilizar los <, >operadores. Sin embargo, dado que es un Comparable, puede usar el compareTo(BigDecimal)para el mismo efecto. P.ej:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}
Mureinik
fuente
0

Utilizando la clase de utilidad com.ibm.etools.marshall.util.BigDecimalRange de IBM, se puede comparar si BigDecimal está en el rango.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
Alexey
fuente
0

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á una BigDecimalinstancia con un valor que no es exactamente 0.8y que tiene una escala de 50+,
  • new BigDecimal("0.8")creará una BigDecimalinstancia con un valor que es exactamente 0.8y 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 BigDecimalinstancias con el BigDecimal(String val)constructor o el BigDecimal.valueOf(double val)método en lugar del BigDecimal(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) .

Adil Hussain
fuente