如何在 BigDecimal 上使用 >、=、< 等比较运算符
Posted
技术标签:
【中文标题】如何在 BigDecimal 上使用 >、=、< 等比较运算符【英文标题】:How to use comparison operators like >, =, < on BigDecimal 【发布时间】:2016-04-13 04:06:32 【问题描述】:我有一个将 unitPrice 设置为 BigDecimal 数据类型的域类。现在我正在尝试创建一种比较价格的方法,但似乎我不能在 BigDecimal 数据类型中使用比较运算符。我必须更改数据类型还是有其他方法?
【问题讨论】:
因为BigDecimal
是Object
,所以这不起作用。但是您可以简单地彼此相减并检查结果值是<0
、==0
还是>0
。否则,您可以使用BigDecimal 提供的方法采用标准方式
这就是为什么有一个 compareTo
方法返回 -1、0 或 1。基本上就是 Comparable
。
github.com/mortezaadi/bigdecimal-utils
【参考方案1】:
BigDecimal
类的每个对象都有一个方法compareTo
,您可以使用它与另一个 BigDecimal 进行比较。然后根据您的需要比较compareTo
的结果> 0
、== 0
或< 0
。阅读文档,您会发现。
运算符==
、<
、>
等只能用于基本数据类型,如int
、long
、double
或其包装类,如Integer
和@987654335 @。
来自compareTo
的文档:
将此
BigDecimal
与指定的BigDecimal
进行比较。两个
BigDecimal
值相等但比例不同的对象(如 2.0 和 2.00) 被这种方法视为相等。提供了这个方法 优先于六个布尔值中的每一个的单独方法 比较运算符(、>=、!=、(x.compareTo(y) <op> 0),其中<op>
是六个比较运算符之一。返回: -1、0 或 1,因为此 BigDecimal 在数值上小于、等于或大于 val。
【讨论】:
但是 compareTo 方法是否有助于查找价格是否大于、等于或低于? 是的。该信息在答案中提供的链接中。 @user3127109 是的,如果a > b
,a.compareTo(b)
返回一个大于零的数字,如果0
,如果0
,如果a < b
,则返回小于零。【参考方案2】:
使用 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】:BigDecimal
不是原语,因此您不能使用<
、>
运算符。但是,由于它是 Comparable
,因此您可以使用 compareTo(BigDecimal)
达到相同的效果。例如:
public class Domain
private BigDecimal unitPrice;
public boolean isCheaperThan(BigDecimal other)
return unitPirce.compareTo(other.unitPrice) < 0;
// etc...
【讨论】:
【参考方案4】:您可以使用名为compareTo
、x.compareTo(y)
的方法。如果 x 和 y 相等则返回 0,如果 x 大于 y 则返回 1,如果 x 小于 y 则返回 -1
【讨论】:
【参考方案5】:简而言之:
firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="
【讨论】:
【参考方案6】:使用 IBM 的 com.ibm.etools.marshall.util.BigDecimalRange util 类可以比较 BigDecimal 是否在范围内。
boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
【讨论】:
【参考方案7】:以下是所有六个布尔比较运算符(、>=、!=、
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
【讨论】:
【参考方案8】:这个帖子有很多答案表明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(String val)
构造函数或BigDecimal.valueOf(double val)
方法而不是BigDecimal(double val)
构造函数创建BigDecimal
实例。其次,请注意,您可以在通过BigDecimal.setScale(int newScale, RoundingMode roundingMode) 方法进行比较之前限制BigDecimal 实例的规模。
【讨论】:
以上是关于如何在 BigDecimal 上使用 >、=、< 等比较运算符的主要内容,如果未能解决你的问题,请参考以下文章
在java中如何将bigdecimal类型转成String类型?
如何在java代码中使用elasticsearch painless BigDecimal?
java中如何使用BigDecimal使得Double类型保留两位有效数字