如何在 BigDecimal 上使用 > ,= ,< 这样的比较运算符

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

290719 次浏览

BigDecimal的每个对象都有一个方法 compareTo,您可以使用它与另一个 BigDecimal 进行比较。compareTo的结果然后比较 > 0== 0< 0取决于你需要什么。阅读文档,你就会发现。

操作符 ==<>等只能用于基本数据类型,如 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 不是基元,因此不能使用 <>运算符。但是,因为它是 Comparable,所以可以使用 compareTo(BigDecimal)达到同样的效果。例如:

public class Domain {
private BigDecimal unitPrice;


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


// etc...
}

可以使用名为 compareTox.compareTo(y)的方法。如果 x 和 y 相等,返回0,如果 x 大于 y,返回1,如果 x 小于 y,返回 -1

简而言之:

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

使用 IBM 的 Com.ibm.etools.marshall.util. BigDecimalRange util 类可以比较 BigDecimal是否在范围内。

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

下面是所有6个布尔比较运算符(< ,= = ,> ,> = ,! = ,< =)的示例:

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 (BigDecimal)方法是用来比较 BigDecimal实例的方法。我只是想为那些没有使用 CompareTo (BigDecimal)方法经验的人添加: 小心创建 BigDecimal实例的方式。例如:

  • new BigDecimal(0.8)将创建一个 BigDecimal实例,其值正好是 没有,并且比例为50 + ,
  • new BigDecimal("0.8")将创建一个 BigDecimal实例,其值 恰好为 0.8,比例为1。

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

摘要

首先,小心使用 BigDecimal(String val)构造函数或 BigDecimal.valueOf(double val)方法而不是 BigDecimal(double val)构造函数创建 BigDecimal实例。其次,请注意,在使用 SetScale (int newScale,RoundingMode round ingMode)方法进行比较之前,您可以限制 BigDecimal实例的规模。

您可以按照这个实用程序的 static 方法和 Operator enum 来比较这两个数字:

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
}

或者,如果您已经在使用 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值的示例。

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