如何在 BigDecimal 上使用 >、= < 等比较运算符



我有一个域类,unitPrice设置为BigDecimal数据类型。现在我正在尝试创建一种比较价格的方法,但似乎我不能在BigDecimal数据类型中使用比较运算符。我是否必须更改数据类型或有其他方法?

简而言之:

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

BigDecimal的每个对象都有一个方法compareTo您可以使用该方法将其与另一个BigDecimal进行比较。然后根据您的需要> 0== 0< 0比较compareTo的结果。阅读文档,您将找到答案。

运算符==<>等只能用于原始数据类型,如intlongdouble或其包装类,如IntegerDouble

compareTo的文档:

将此

BigDecimal与指定的BigDecimal进行比较。

两个BigDecimal 值相等但比例不同的对象(如 2.0 和 2.00( 通过此方法被视为相等。提供此方法 优先于六个布尔值中每个布尔值的单独方法 比较运算符(<、==、>、>=、!=、<=(。建议的成语 执行这些比较是: (x.compareTo(y) <op> 0) ,其中<op> 是六个比较运算符之一。

返回: -1、0 或 1,因为此 BigDecimal 在数值上小于、等于或大于 val。

使用 BigDecimal 的compareTo方法:

public int compareTo(BigDecimal val( 将此 BigDecimal 与 指定大十进制。

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

所有六个布尔比较运算符(<,==,>,>=,!=,<=(的示例:

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
您可以使用

名为 compareTo 的方法,x.compareTo(y) 。如果 x 和 y 相等,它将返回 0

,如果 x 大于 y,则返回 1,如果 x 小于 y 则返回 -1
或者

,如果您已经在使用commons-lang3(版本 3.10 及更高版本(,则可以像这样利用他们的ComparableUtils API:

import static org.apache.commons.lang3.compare.ComparableUtils.is;
var areEqual = is(first).equalTo(second);
var isGreater = is(first).greaterThan(second);
var isLess = is(first).lessThan(second);
var isBetween = is(first).between(second, third);
// etc.

如今,大多数大型项目都包含commons-lang3作为依赖项。

讨论

这个线程有很多答案,指出BigDecimal.compareTo(BigDecimal(方法是用来比较BigDecimal 实例的方法。我只是想为没有使用BigDecimal.compareTo(BigDecimal(方法经验的人补充一点:小心创建BigDecimal 实例的方式。例如:

  • new BigDecimal(0.8)将创建一个BigDecimal实例,其值完全0.8,其比例为 50+,
  • new BigDecimal("0.8")将创建一个 BigDecimal 实例,其值正好0.8小数位数为 1。

根据 BigDecimal.compareTo(BigDecimal( 方法,这两个 BigDecimal 实例是不相等的,因为当小数位数不限于几位时,它们的值是不相等的。

总结

首先,请注意使用 BigDecimal(String val) 构造函数或 BigDecimal.valueOf(double val) 方法而不是BigDecimal(double val)构造函数创建 BigDecimal 实例。其次,请注意,在通过 BigDecimal.setScale(int newScale, RoundingMode roundingMode( 方法比较 BigDecimal 实例之前,您可以限制它们的比例。

BigDecimal不是

基元,因此不能使用<>运算符。但是,由于它是一个 Comparable ,您可以使用compareTo(BigDecimal)达到相同的效果。例如:

public class Domain {
    private BigDecimal unitPrice;
    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }
    // etc...
}

您可以按照此实用程序静态方法和运算符枚举来比较两个数字:

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
}

使用 com.ibm.etools.marshall.util.BigDecimalRange util class of IBM 可以比较 BigDecimal 的范围。

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

比较两个BigDecimal值的示例。

public class BigDecimalDemo {
   public static void main(String[] args) {
      // create 2 BigDecimal objects
      BigDecimal bg1, bg2;
      bg1 = new BigDecimal("10");
      bg2 = new BigDecimal("20");
      //create int object
      int res;
      res = bg1.compareTo(bg2); // compare bg1 with bg2
      String str1 = "Both values are equal ";
      String str2 = "First Value is greater ";
      String str3 = "Second value is greater";
      if( res == 0 )
         System.out.println( str1 );
      else if( res == 1 )
         System.out.println( str2 );
      else if( res == -1 )
         System.out.println( str3 );
   }
}

最新更新