How to use comparison operators like >, =, < on BigDecimal

JavaOperator KeywordBigdecimal

Java Problem Overview


I have a domain class with unitPrice set as BigDecimal data type. Now I am trying to create a method to compare price but it seems like I can't have comparison operators in BigDecimal data type. Do I have to change data type or is there other way around?

Java Solutions


Solution 1 - Java

To be short:

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

Solution 2 - Java

Every object of the Class BigDecimal has a method compareTo you can use to compare it to another BigDecimal. The result of compareTo is then compared > 0, == 0 or < 0 depending on what you need. Read the documentation and you will find out.

The operators ==, <, > and so on can only be used on primitive data types like int, long, double or their wrapper classes like Integerand Double.

From the documentation of compareTo:

> Compares this BigDecimal with the specified BigDecimal.

> Two BigDecimal > objects that are equal in value but have a different scale (like 2.0 > and 2.00) are considered equal by this method. This method is provided > in preference to individual methods for each of the six boolean > comparison operators (<, ==, >, >=, !=, <=). The suggested idiom for > performing these comparisons is: (x.compareTo(y) <op> 0), where <op> > is one of the six comparison operators.

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

Solution 3 - Java

Use the compareTo method of BigDecimal :

> public int compareTo(BigDecimal val) Compares this BigDecimal with the > specified BigDecimal. > > > Returns: > -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

Solution 4 - Java

Here is an example for all six boolean comparison operators (<, ==, >, >=, !=, <=):

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

Solution 5 - Java

You can use method named compareTo, x.compareTo(y). It will return 0 if x and y are equal, 1 if x is greater than y and -1 if x is smaller than y

Solution 6 - Java

BigDecimal isn't a primitive, so you cannot use the <, > operators. However, since it's a Comparable, you can use the compareTo(BigDecimal) to the same effect. E.g.:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}

Solution 7 - Java

Discussion

This thread has plenty of answers stating that the BigDecimal.compareTo(BigDecimal) method is the one to use to compare BigDecimal instances. I just wanted to add for anyone not experienced with using the BigDecimal.compareTo(BigDecimal) method: Be careful with how you create your BigDecimal instances. For example:

  • new BigDecimal(0.8) will create a BigDecimal instance with a value which is not exactly 0.8 and which has a scale of 50+,
  • new BigDecimal("0.8") will create a BigDecimal instance with a value which is exactly 0.8 and which has a scale of 1.

These two BigDecimal instances are unequal according to the BigDecimal.compareTo(BigDecimal) method because their values are unequal when the scale is not limited to a few decimal places.

Summary

Firstly, be careful to create your BigDecimal instances with the BigDecimal(String val) constructor or the BigDecimal.valueOf(double val) method rather than the BigDecimal(double val) constructor. Secondly, note that you can limit the scale of BigDecimal instances prior to comparing them by means of the BigDecimal.setScale(int newScale, RoundingMode roundingMode) method.

Solution 8 - Java

You can follow this utility static method and Operator enum for comparing the two numbers:

public static boolean check(BigDecimal firstNum, Operator operator, BigDecimal secondNum) {
    switch (operator) {
        case EQUALS:
            return firstNum.compareTo(secondNum) == 0;
        case LESS_THAN:
            return firstNum.compareTo(secondNum) < 0;
        case LESS_THAN_OR_EQUALS:
            return firstNum.compareTo(secondNum) <= 0;
        case GREATER_THAN:
            return firstNum.compareTo(secondNum) > 0;
        case GREATER_THAN_OR_EQUALS:
            return firstNum.compareTo(secondNum) >= 0;
    }

    throw new IllegalArgumentException("Will never reach here");
}

public enum Operator {
    LESS_THAN, LESS_THAN_OR_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUALS, EQUALS
}

Solution 9 - Java

Using com.ibm.etools.marshall.util.BigDecimalRange util class of IBM one can compare if BigDecimal in range.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3127109View Question on Stackoverflow
Solution 1 - JavatorinaView Answer on Stackoverflow
Solution 2 - JavaSimulantView Answer on Stackoverflow
Solution 3 - JavaArnaudView Answer on Stackoverflow
Solution 4 - JavaognjenklView Answer on Stackoverflow
Solution 5 - JavaAgung SetiawanView Answer on Stackoverflow
Solution 6 - JavaMureinikView Answer on Stackoverflow
Solution 7 - JavaAdil HussainView Answer on Stackoverflow
Solution 8 - JavaMehdiView Answer on Stackoverflow
Solution 9 - JavaAlexeyView Answer on Stackoverflow