我有一个域类,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
的结果。阅读文档,您将找到答案。
运算符==
、<
、>
等只能用于原始数据类型,如int
、long
、double
或其包装类,如Integer
和Double
。
从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
,如果您已经在使用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 );
}
}