我有一个domainPrice设置为BigDecimal数据类型的域类。现在我正在尝试创建一个比较价格的方法,但似乎我不能在BigDecimal数据类型中有比较运算符。我是否必须更改数据类型或是否有其他方法?
答案 0 :(得分:83)
类BigDecimal
的每个对象都有一个方法compareTo
,您可以使用该方法将其与另一个BigDecimal进行比较。然后将compareTo
的结果与> 0
,== 0
或< 0
进行比较,具体取决于您的需求。阅读文档,你会发现。
运营商==
,<
,>
等只能用于原始数据类型,例如int
,long
,{{1}或者他们的包装类,如double
和Integer
。
来自Double
的文档:
将此
compareTo
与指定的BigDecimal
进行比较。两个
BigDecimal
值相等但具有不同比例的对象(如2.0 通过这种方法被认为是相同的。提供了该方法 优先于六个布尔值中的每一个的单独方法 比较运算符(&lt;,==,&gt;,&gt; =,!=,&lt; =)。建议的成语 执行这些比较的是:BigDecimal
,其中(x.compareTo(y) <op> 0)
是六个比较运算符之一。返回: -1,0或1,因为此BigDecimal在数值上小于,等于或大于val。
答案 1 :(得分:67)
简短:
firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="
答案 2 :(得分:19)
使用BigDecimal的compareTo
方法:
public int compareTo(BigDecimal val)将此BigDecimal与。进行比较 指定BigDecimal。
Returns: -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
答案 3 :(得分:9)
您可以使用名为compareTo
,x.compareTo(y)
的方法。如果x和y相等则返回0,如果x大于y则返回1,如果x小于y则返回-1
答案 4 :(得分:5)
BigDecimal
不是原始的,因此您无法使用<
,>
运算符。但是,由于它是Comparable
,您可以使用compareTo(BigDecimal)
来达到同样的效果。 E.g:
public class Domain {
private BigDecimal unitPrice;
public boolean isCheaperThan(BigDecimal other) {
return unitPirce.compareTo(other.unitPrice) < 0;
}
// etc...
}
答案 5 :(得分:0)
使用IBM的 com.ibm.etools.marshall.util.BigDecimalRange util类可以比较范围内的 BigDecimal 。
boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
答案 6 :(得分:0)
以下是所有六个布尔比较运算符(<,==,>,> =,!=,<=)的示例:
recyclerView.loadItemsBeforeTheyBecomeVisible(int numberOfLoadingItem);
答案 7 :(得分:0)
此线程有很多答案,指出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方法限制BigDecimal.setScale(int newScale, RoundingMode roundingMode)实例的规模,然后再进行比较。