我有以下代码在Java;

BigDecimal price; // assigned elsewhere

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

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


当前回答

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

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

其他回答

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

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

与BigDecimal常量BigDecimal进行比较。ZERO避免了每次执行都必须构造一个新的BigDecimal(0)。

供你参考,BigDecimal也有常量BigDecimal。ONE和BigDecimal。十张,方便您使用。


注意!

你不能使用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

我通常使用以下方法:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
if(price.floatValue() == 0){
   return true; //works for 0\0.0
}

有一个静态常数表示0:

BigDecimal.ZERO.equals(selectPrice)

你应该这样做,而不是:

selectPrice.equals(BigDecimal.ZERO)

以避免selectPrice为空的情况。

对于你的例子,一个简单而更好的方法是:

BigDecimal price;

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

}