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

Posted

技术标签:

【中文标题】如何在 BigDecimal 上使用 >、=、< 等比较运算符【英文标题】:How to use comparison operators like >, =, < on BigDecimal 【发布时间】:2016-04-13 04:06:32 【问题描述】:

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

【问题讨论】:

因为BigDecimalObject,所以这不起作用。但是您可以简单地彼此相减并检查结果值是&lt;0==0 还是&gt;0。否则,您可以使用BigDecimal 提供的方法采用标准方式 这就是为什么有一个 compareTo 方法返回 -1、0 或 1。基本上就是 Comparable github.com/mortezaadi/bigdecimal-utils 【参考方案1】:

BigDecimal 类的每个对象都有一个方法compareTo,您可以使用它与另一个 BigDecimal 进行比较。然后根据您的需要比较compareTo 的结果&gt; 0== 0&lt; 0。阅读文档,您会发现。

运算符==&lt;&gt; 等只能用于基本数据类型,如intlongdouble 或其包装类,如Integer和@987654335 @。

来自compareTo的文档:

将此BigDecimal 与指定的BigDecimal 进行比较。

两个BigDecimal 值相等但比例不同的对象(如 2.0 和 2.00) 被这种方法视为相等。提供了这个方法 优先于六个布尔值中的每一个的单独方法 比较运算符(、>=、!=、(x.compareTo(y) <op> 0),其中&lt;op&gt; 是六个比较运算符之一。

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

【讨论】:

但是 compareTo 方法是否有助于查找价格是否大于、等于或低于? 是的。该信息在答案中提供的链接中。 @user3127109 是的,如果a &gt; ba.compareTo(b) 返回一个大于零的数字,如果0,如果0,如果a &lt; 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 不是原语,因此您不能使用&lt;&gt; 运算符。但是,由于它是 Comparable,因此您可以使用 compareTo(BigDecimal) 达到相同的效果。例如:

public class Domain 
    private BigDecimal unitPrice;

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

    // etc...

【讨论】:

【参考方案4】:

您可以使用名为compareTox.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 上使用 >、=、< 等比较运算符的主要内容,如果未能解决你的问题,请参考以下文章

使用流和求和方法的BigDecimal List的总和

在java中如何将bigdecimal类型转成String类型?

如何在java代码中使用elasticsearch painless BigDecimal?

java中如何使用BigDecimal使得Double类型保留两位有效数字

Java 中如何比较两个BigDecimal 以及BigDecimal的坑

jsp中如何使用BigDecimal进行计算?