回答:
の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;
}
BigDecimal.ZERO.compareTo(null)
NPEをスローします
確認できる定数があります。
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
、compareTo
あなたが思うほどではありません。docs.oracle.com/javase/1.5.0/docs/api/java/math/...
あるいは、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
変数のスケールには十分注意する必要があります。そうしないと、予期しない結果が発生します。
equals()はオブジェクトなので、組み込みのZEROインスタンスを使用する必要があります。
if(selectPrice.equals(BigDecimal.ZERO))
注.equals()
selectPriceが同じスケールであるのでない限り、考慮に規模をとる(0)として.ZERO
、これは偽を返します。
方程式のスケールをそのままにするには:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
特定の数学的な状況0.00 != 0
について.equals()
は、スケールを考慮に入れると想像するのはこのためです。0.00
100分の1の精度を提供します0
が、それほど正確ではありません。状況によっては、こだわりたいかもしれません.equals()
。
equals
、compareTo
あなたが思うほどではありません。docs.oracle.com/javase/1.5.0/docs/api/java/math/...
equals
スケールを考慮に入れますが、ここでは必要ありません。
equals
必要がある状況もありますが、情報をありがとうございcompareTo()
ます。OPは彼が使用している数学のタイプを指定していません。そのため、両方のオプションを指定することをお勧めします。
GriffeyDogは間違いなく正しいです。
コード:
BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));
結果:
myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
equals=false
compare=true
BigDecimal比較の利点は理解していますが、(==、<、>、<=、> =演算子のように)直感的な構成とは見なしません。頭の中に100万もの(大丈夫、7つのもの)を抱えている場合、認知負荷を軽減できるものは何でも良いことです。だから私はいくつかの便利な便利な関数を作りました:
public static boolean equalsZero(BigDecimal x) {
return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) >= 0);
}
それらを使用する方法は次のとおりです。
System.out.println("Starting main Utils");
BigDecimal bigDecimal0 = new BigDecimal(00000.00);
BigDecimal bigDecimal2 = new BigDecimal(2);
BigDecimal bigDecimal4 = new BigDecimal(4);
BigDecimal bigDecimal20 = new BigDecimal(2.000);
System.out.println("Positive cases:");
System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
System.out.println("bigDecimal2=" + bigDecimal2 + " < bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " > bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
System.out.println("Negative cases:");
System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " < bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " > bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));
結果は次のようになります。
Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 < bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 > bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 < bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 > bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
BigDecimal.ZERO.equals(selectPrice)
次の代わりにこれを行う必要があります。
selectPrice.equals(BigDecimal.ZERO)
ケースを避けるためでselectPrice
あるがnull
。
equals
、compareTo
あなたが思うほどではありません。docs.oracle.com/javase/1.5.0/docs/api/java/math/...