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.ONE和BigDecimal.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)
小智 91
或者,可以使用signum():
if (price.signum() == 0) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
pab*_*han 24
有一个常数可以检查:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Run Code Online (Sandbox Code Playgroud)
对于您的示例来说,一个简单且更好的方法是:
BigDecimal price;
if(BigDecimal.ZERO.compareTo(price) == 0){
//Returns TRUE
}
Run Code Online (Sandbox Code Playgroud)
我通常使用以下内容:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
Run Code Online (Sandbox Code Playgroud)
您将要使用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()。
或者,我认为值得一提的是,类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变量中的比例,否则会得到意外的结果.