私はJavaで次のコードを持っています。
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
if 条件を記述する最良の方法は何ですか?
私は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
あるいは、クラス 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
払う必要があります。そうしないと、予期しない結果が生じる可能性があります。
私は通常以下を使用します:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
equals()
それらはオブジェクトであるため使用し、組み込みのZERO
インスタンスを利用することをお勧めします。
if (selectPrice.equals(BigDecimal.ZERO))
.equals()
スケールが考慮されることに注意してください。したがって、selectPriceが同じスケール(0)でない限り.ZERO
、これはfalseを返します。
方程式からスケールを取り除くには、次のようにします。
if (selectPrice.compareTo(BigDecimal.ZERO) == 0)
特定の数学的状況では、、がスケールを考慮に入れている0.00 != 0
と私が想像する理由であることに注意する必要があります。100分の1の位置に精度を与えますが、それほど正確ではありません。状況によっては、に固執することをお勧めします。.equals()
0.00
0
.equals()
if(price.floatValue() == 0){
return true; //works for 0\0.0
}
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
0を表す静的定数があります:
BigDecimal.ZERO.equals(selectPrice)
次の代わりにこれを行う必要があります。
selectPrice.equals(BigDecimal.ZERO)
の場合を避けるためselectPrice
にnull
。