如何在java中检查BigDecimal变量== 0?

JoJ*_*oJo 189 java bigdecimal

我在Java中有以下代码;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

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

Boh*_*ian 431

使用compareTo(BigDecimal.ZERO)而不是equals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

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

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Run Code Online (Sandbox Code Playgroud)

  • BigDecimal.ZERO.compareTo(价格) == 0 (6认同)
  • BigDecimal 的这种实现是否有任何特殊原因 - “new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!”?为什么 0.00 不以 0 比例缩小为 0? (2认同)
  • @Mehrnoosh它永远不会是因为在Java中`==`比较对象身份 - 即如果它是同一个对象,而不是如果两侧具有相同的值。在 Java 中,始终使用 .equals() 来比较事物。 (2认同)

小智 91

或者,可以使用signum():

if (price.signum() == 0) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 也许它更快,但compareTo(BigDecimal.ZERO)更具可读性. (19认同)
  • @WeGa那不是真的:`BigDecimal.ZERO.compareTo(null)`会抛出NPE (14认同)
  • 最好和最快的方式.这应该是正确的答案. (8认同)
  • @ACV,谢谢你的警惕.看一下源代码,compareTo()确实只需要非null参数. (5认同)
  • 不幸的是signum()不是空安全的,而compareTo是,比较像BigDecimal.ZERO.compareTo(),所以要注意那个 (3认同)

pab*_*han 24

有一个常数可以检查:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Run Code Online (Sandbox Code Playgroud)

  • 要求窃取"尤达条件"术语的许可. (3认同)
  • [太棒了](http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html). (3认同)
  • 如果传入null,BigDecimal的compareTo仍将抛出异常. (2认同)

Fél*_*roy 6

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

BigDecimal price;

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

}
Run Code Online (Sandbox Code Playgroud)

  • 为唯一的空安全解决方案点赞。 (3认同)

gpo*_*pol 5

我通常使用以下内容:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
Run Code Online (Sandbox Code Playgroud)


Nom*_*Sim 5

您将要使用equals(),因为它们是对象,并利用内置的ZERO实例:

if(selectPrice.equals(BigDecimal.ZERO))
Run Code Online (Sandbox Code Playgroud)

请注意,这要.equals()考虑小数位数,因此,除非selectPrice与小数位数(0)相同,否则.ZERO它将返回false。

从等式中缩小比例:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
Run Code Online (Sandbox Code Playgroud)

我应该注意,对于某些数学情况,0.00 != 0这就是为什么我.equals()认为将比例尺考虑在内。0.00精确到百分之一,而0不是那么精确。根据情况,您可能需要坚持.equals()


Edw*_*rzo 5

或者,我认为值得一提的是,类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
Run Code Online (Sandbox Code Playgroud)

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