0

と の 2 つBigDecimalsvalue1ありvalue2ます。で割りたいのvalue1ですvalue2が、そのうちの1つがゼロの場合は明らかにしたくありません。だから私はこの単純なif文を書いた:

if(!value1.equals(0) && !value2.equals(0)){
  divide value1 by value2 blah blah blah
}

何らかの理由で、このifステートメントは機能しませんでした..値の1つがゼロに等しい場合でも、ゼロで除算しようとしていたため、方程式が評価されてエラーが発生しました。私はそれを使っvalue1.compareTo(BigDecimal.valueOf(0) == 1てやりたいことを手に入れることができることを知っていますが、最初の方法がうまくいかなかった理由について知りたいです。

4

2 に答える 2

5

Java は、異なる型のオブジェクトを異なるものとして扱います。これは、それらが同等のものを表していても、同じではないことを意味します。

BigDecimal の「特別」な点は、型が同じで値が等しい場合でも、スケールが異なる場合でも、それらは「等しい」わけではないということです。

Double d = 0.0;
Integer i = 0;
System.out.println(d + " equals " + i + " is " + (d.equals(i)));

BigDecimal bd2 = new BigDecimal("0.00");
BigDecimal bd3 = new BigDecimal("0.000");

System.out.println(bd2 + " equals " + d + " is " + (bd2.equals(d)));
System.out.println(bd2 + " equals " + bd2 + " is " + (bd2.equals(bd2)));
System.out.println(bd2 + " equals " + bd3 + " is " + (bd2.equals(bd3)));

版画

0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false

これを回避する方法は、スケールを調整してより自然な比較を行うcompareToを使用することです。

System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO )));
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO )));

版画

0.00 compareTo 0 is 0
0.000 compareTo 0 is 0

これは、BigDecimal を使用する場合は、次のように記述する必要があることを意味します

if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {

個人的にdoubleは、よりシンプルで高速な方を使用することを好みます。唯一の欠点は、丸めを自分で管理する必要があることです。

double div = value1 / value2;
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) {
   // division was ok.
   System.out.printf("%.4f", div); // print with rounding.
于 2013-01-09T09:40:02.520 に答える
0

代わりにこれを使用してください。

  if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0) 
  {
     ....
  }

equals動作しないでしょう。

これを確認してください: public boolean equals(Object x) この BigDecimal と指定されたオブジェクトが等しいかどうかを比較します。compareTo とは異なり、このメソッドは、値とスケールが等しい場合にのみ 2 つの BigDecimal オブジェクトが等しいと見なします (したがって、このメソッドで比較した場合、2.0 は 2.00 と等しくありません)。

于 2013-01-09T09:45:13.893 に答える