1

###、###。##の形式を使用して1つのBIgDecimalを生成すると、結果は660,000.00になります。次に、それをaに対して同一マップしようとしnew BigDecimal(660000.00)ますが、毎回falseが返されます。不変の値を、それらが作成された初期形式と比較する方法はありますか?

4

1 に答える 1

2

これは、2つのスケールBigDecimalsが異なるためです。

System.out.println(new BigDecimal("660000.00").scale()); // 2
System.out.println(new BigDecimal(660000.00).scale());   // 0

規模に関係なくそれらを比較するには、次のようにします。

BigDecimal bd1 = new BigDecimal("660000.00");
BigDecimal bd2 = new BigDecimal(660000.00);

int s = Math.max(bd1.scale(), bd2.scale());
.. bd1.setScale(s).equals(bd2.setScale(s)) ..   // == true.

補足:たとえば、二重リテラル.1は実際の値.1を表すのではなく、その近似値を表すことに注意してください。(これは、浮動小数点表現の不正確さによるものです。)これは、次のようにすることで確認できます。

System.out.println(new BigDecimal(.1));

0.1000000000000000055511151231257827021181583404541015625を出力します

ただし、new BigDecimal(".1")実際には正確に.1を表しているため、

new BigDecimal(.1).equals(new BigDecimal(".1"))

は偽です。

于 2012-08-23T09:18:33.557 に答える