如何检查在Java中BigDecimalvariables== 0?

我在Java中有以下代码;

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

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

使用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 

或者,可以使用signum() :

 if (price.signum() == 0) { return true; } 

有一个常数,你可以检查:

 someBigDecimal.compareTo(BigDecimal.ZERO) == 0 

我通常使用以下内容:

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

你会想使用equals(),因为它们是对象,并利用内置的ZERO实例:

 if(selectPrice.equals(BigDecimal.ZERO)) 

请注意, .equals()需要考虑规模,所以除非selectPrice与.ZERO具有相同的比例(0), .ZERO将返回false。

像以前那样从等式中取出比例:

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

我应该注意的是,对于某些math情况, 0.00 != 0 ,这就是为什么我想象.equals()把尺度考虑在内。 0.00给百分之一精度,而0不是那么精确。 根据情况你可能要坚持使用.equals()

另外,我认为值得一提的是类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 

因此,你必须非常小心你的someValuevariables的规模,否则你会得到意想不到的结果。

 BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00")); 

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

 BigDecimal.ZERO.equals(selectPrice) 

你应该这样做,而不是:

 selectPrice.equals(BigDecimal.ZERO) 

以避免selectPricenull的情况。