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

use*_*109 88 java spring bigdecimal operator-keyword

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

Sim*_*ant 101

Class的每个对象BigDecimal都有一个方法compareTo可用于将它与另一个BigDecimal进行比较.compareTo然后将结果进行比较> 0,== 0或者< 0根据您的需要进行比较.阅读文档,你会发现.

运营商==,<,>等只能在基本数据类型等中使用int,long,double或它们的包装类等IntegerDouble.

来自以下文件compareTo:

将其BigDecimal与指定的进行比较BigDecimal.

BigDecimal 通过此方法,两个值相等但具有不同比例(如2.0和2.00)的对象被认为是相等的.对于六个布尔比较运算符(<,==,>,> =,!=,<=)中的每一个,优先考虑该方法.建议用于执行这些比较的习惯是:(x.compareTo(y) <op> 0),<op> 六个比较运算符之一.

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

  • @ user3127109是的,`a.compareTo(b)`如果`a> b`则返回大于零的数字,如果`a == b`则返回'0`,如果'a <b`则返回小于零. (4认同)
  • 是.该信息位于答案中提供的链接中. (2认同)

tor*_*ina 90

简而言之:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    
Run Code Online (Sandbox Code Playgroud)


Arn*_*aud 20

使用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.
Run Code Online (Sandbox Code Playgroud)


小智 15

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

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
Run Code Online (Sandbox Code Playgroud)


Pri*_*mre 12

或者,如果您已经在使用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.
Run Code Online (Sandbox Code Playgroud)

无论如何,现在大多数大型项目都包含commons-lang3依赖项。


Agu*_*wan 11

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


Adi*_*ain 10

讨论

该线程有大量答案,指出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首先,请小心使用BigDecimal(String val)构造函数或BigDecimal.valueOf(double val)方法而不是构造函数创建实例BigDecimal(double val)。其次,请注意,您可以在通过BigDecimal.setScale(int newScale, RoundingMode roundingMode)方法进行比较之前限制BigDecimal实例的范围。


Mur*_*nik 5

BigDecimal不是原始的,所以你不能使用<,>运算符.但是,因为它是a Comparable,你可以使用compareTo(BigDecimal)相同的效果.例如:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
Run Code Online (Sandbox Code Playgroud)