254

我在Java中有以下代码;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

编写 if 条件的最佳方法是什么?

4

12 回答 12

595

使用compareTo(BigDecimal.ZERO)代替equals()

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

BigDecimal常量比较BigDecimal.ZERO避免了必须构造一个new BigDecimal(0)每次执行。

仅供参考,BigDecimal也有常数BigDecimal.ONEBigDecimal.TEN为了您的方便。


笔记!

您不能使用的原因BigDecimal#equals()是它考虑了规模

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

所以它不适合纯粹的数字比较。但是,BigDecimal.compareTo()比较时不考虑比例:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
于 2012-06-08T14:38:44.363 回答
113

或者,可以使用signum() :

if (price.signum() == 0) {
    return true;
}
于 2012-08-30T21:38:39.823 回答
27

您可以检查一个常量:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0
于 2012-06-08T14:38:49.207 回答
9

另外,我认为值得一提的是 BigDecimal 类中 equals 和 compareTo 方法的行为并不一致

这基本上意味着:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO) == 0); // true
System.out.println(someValue.equals(BigDecimal.ZERO)); // false

因此,您必须非常小心someValue变量中的比例,否则您会得到意想不到的结果。

于 2012-06-08T14:51:14.907 回答
5

我通常使用以下内容:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
于 2012-06-08T14:39:49.253 回答
5

由于它们是对象,因此您会想要使用equals()它们,并利用内置ZERO实例:

if (selectPrice.equals(BigDecimal.ZERO))

请注意,.equals()将比例考虑在内,因此除非 selectPrice 与比例相同(0),.ZERO否则这将返回 false。

要按原样从等式中取出比例:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0)

我应该注意,对于某些数学情况,0.00 != 0,这就是为什么我想.equals()考虑规模。0.00精确到百分之一,而0没有那么精确。根据您可能要坚持的情况.equals()

于 2012-06-08T14:39:58.683 回答
4

GriffeyDog 绝对正确:

代码:

BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));

结果:

myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
 equals=false
compare=true

虽然我了解 BigDecimal 比较的优点,但我不会认为它是一种直观的构造(就像 ==、<、>、<=、>= 运算符一样)。当你脑子里有一百万件事情(好吧,七件事情)时,任何可以减轻认知负担的事情都是一件好事。所以我构建了一些有用的便利功能:

public static boolean equalsZero(BigDecimal x) {
    return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
    return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
    return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
    return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) >= 0);
}

以下是如何使用它们:

    System.out.println("Starting main Utils");
    BigDecimal bigDecimal0 = new BigDecimal(00000.00);
    BigDecimal bigDecimal2 = new BigDecimal(2);
    BigDecimal bigDecimal4 = new BigDecimal(4);  
    BigDecimal bigDecimal20 = new BigDecimal(2.000);
    System.out.println("Positive cases:");
    System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <  bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >  bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
    System.out.println("Negative cases:");
    System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <  bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >  bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));

结果如下所示:

Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 <  bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 >  bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 <  bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 >  bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
于 2019-05-24T15:14:21.823 回答
4

对于您的示例,一个简单且更好的方法是:

BigDecimal price;

if(BigDecimal.ZERO.compareTo(price) == 0){
    
   //Returns TRUE

}
于 2020-11-30T19:59:02.240 回答
0

只想在这里分享一些对 kotlin 有用的扩展

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0
于 2019-01-17T06:57:10.700 回答
0
if(price.floatValue() == 0){
   return true; //works for 0\0.0
}
于 2021-05-07T16:42:05.500 回答
-2
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
于 2017-04-07T08:28:55.720 回答
-9

有一个代表 0的静态常数:

BigDecimal.ZERO.equals(selectPrice)

你应该这样做而不是:

selectPrice.equals(BigDecimal.ZERO)

以避免出现 where selectPriceis的情况null

于 2012-06-08T14:39:08.897 回答