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


103

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


由于BigDecimalObject,所以这行不通。但是,你可以简单地减去一个相互并检查结果值<0==0>0。否则,您可以使用BigDecimal中
SomeJavaGuy

2
这就是为什么有一种compareTo返回-1、0或1 的方法的原因Comparable
M. Deinum '16

Answers:


113

Class的每个对象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。


1
但是compareTo方法是否有助于发现价格是大于,等于还是小于?
user3127109 '16

2
是。该信息在答案中提供的链接中。
德鲁·肯尼迪

4
@ user3127109是,a.compareTo(b)如果a > b0则返回一个大于零的数字,如果a == b,则返回一个小于零的数字a < b
佐尔坦

119

简而言之:

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

22

使用compareToBigDecimal 的方法:

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.

12

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


11

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

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

5

BigDecimal是不是原始的,所以你不能使用的<>经营者。但是,由于它是Comparable,您可以使用compareTo(BigDecimal)来达到相同的效果。例如:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}

0

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

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

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.valueOf(double val)方法而不是BigDecimal(double val)构造函数创建实例。其次,请注意,在通过BigDecimal.setScale(int newScale,RoundingMode roundingMode)方法进行比较之前,可以限制BigDecimal实例的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.