如何使用 >、=、< on BigDecimal

问题描述 投票:0回答:11

我有一个域类,其中

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

java operator-keyword bigdecimal
11个回答
271
投票

简而言之:

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

156
投票

BigDecimal
的每个对象都有一个方法
compareTo
,您可以使用它与另一个BigDecimal进行比较。然后,根据您的需要,将
compareTo
的结果与
> 0
== 0
< 0
进行比较。阅读文档你就会知道。

运算符

==
<
>
等只能用于基本数据类型,如
int
long
double
或其包装类,如
Integer
Double

来自

compareTo
的文档:

将此

BigDecimal
与指定的
BigDecimal
进行比较。

两个

BigDecimal
价值相等但比例不同的对象(例如 2.0 和 2.00) 通过此方法被认为是相等的。提供了这个方法 优先于六个布尔值中每一个的单独方法 比较运算符 (<, ==, >、>=、!=、<=). The suggested idiom for performing these comparisons is:
(x.compareTo(y) <op> 0)
,其中
<op>
是六个比较运算符之一。

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


30
投票

使用 BigDecimal 的

compareTo
方法:

public intcompareTo(BigDecimal val) 将此 BigDecimal 与 指定 BigDecimal。

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

25
投票

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

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

18
投票

您可以使用名为

compareTo
x.compareTo(y)
的方法。如果 x 和 y 相等,则返回 0;如果 x 大于 y,则返回 1;如果 x 小于 y,则返回 -1


14
投票

或者,如果您已经在使用

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.

如今,大多数大型项目都包含

commons-lang3
作为依赖项。


10
投票

讨论

该线程有大量答案,指出 BigDecimal.compareTo(BigDecimal) 方法是用于比较 BigDecimal 实例的方法。我只是想为没有使用 BigDecimal.compareTo(BigDecimal) 方法经验的人补充一点:请小心创建 BigDecimal 实例的方式。例如:

  • new BigDecimal(0.8)
    将创建一个
    BigDecimal
    实例,其值完全是
    0.8
    并且其比例为 50+,
  • new BigDecimal("0.8")
    将创建一个
    BigDecimal
    实例,其值 is 恰好为
    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 实例的比例。


6
投票

BigDecimal
不是原语,因此您不能使用
<
>
运算符。但是,由于它是
Comparable
,因此您可以使用
compareTo(BigDecimal)
达到相同的效果。例如:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}

3
投票

您可以按照此实用程序静态方法和运算符枚举来比较两个数字:

public static boolean check(BigDecimal firstNum, Operator operator, BigDecimal secondNum) {
    switch (operator) {
        case EQUALS:
            return firstNum.compareTo(secondNum) == 0;
        case LESS_THAN:
            return firstNum.compareTo(secondNum) < 0;
        case LESS_THAN_OR_EQUALS:
            return firstNum.compareTo(secondNum) <= 0;
        case GREATER_THAN:
            return firstNum.compareTo(secondNum) > 0;
        case GREATER_THAN_OR_EQUALS:
            return firstNum.compareTo(secondNum) >= 0;
    }

    throw new IllegalArgumentException("Will never reach here");
}

public enum Operator {
    LESS_THAN, LESS_THAN_OR_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUALS, EQUALS
}

0
投票

下面是比较两个

BigDecimal
值的示例。

public class BigDecimalDemo {

   public static void main(String[] args) {

      // create 2 BigDecimal objects
      BigDecimal bg1, bg2;

      bg1 = new BigDecimal("10");
      bg2 = new BigDecimal("20");

      //create int object
      int res;

      res = bg1.compareTo(bg2); // compare bg1 with bg2

      String str1 = "Both values are equal ";
      String str2 = "First Value is greater ";
      String str3 = "Second value is greater";

      if( res == 0 )
         System.out.println( str1 );
      else if( res == 1 )
         System.out.println( str2 );
      else if( res == -1 )
         System.out.println( str3 );
   }
}

-1
投票

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

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
© www.soinside.com 2019 - 2024. All rights reserved.