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.