如何检查在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.ONE
和BigDecimal.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
因此,你必须非常小心你的someValue
variables的规模,否则你会得到意想不到的结果。
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
有一个代表0的静态常量:
BigDecimal.ZERO.equals(selectPrice)
你应该这样做,而不是:
selectPrice.equals(BigDecimal.ZERO)
以避免selectPrice
为null
的情况。