7

BigDecimalを使用して、2桁に丸められた2つの通貨値を比較することを考えています。たとえば、0.02に丸める必要があるものと0.02であるものを比較しているため、次の結果は0になると予想します。しかし、それは-1をもたらします!! これを行う正しい方法はありますか?

これは、123.45対123.4534のような大きな数値でも機能するはずです...「compareTo」が使用されている場合は0になります。

数学の文脈を使ってみましたが、エレガントではないようです...正しい方法はありますか?

BigDecimal spread = new BigDecimal(0.01934);
spread.setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02)));

そして解決策は次のとおりです。

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread));
4

2 に答える 2

10

まず、BigDecimalは不変です。setScaleメソッド呼び出しから結果を返す必要があります。

spread = spread.setScale(2, RoundingMode.HALF_EVEN);

次に、2番目のBigDecimalはdoubleから派生しているため、精度を向上させる必要があります。これは、あまり正確なエンティティではありません。したがって、文字列を試してください。

 spread.compareTo(new BigDecimal("0.02"))
于 2012-06-24T02:04:27.450 に答える
5

0.02 が評価されます

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875

そこにも Scale(2, RoundingMode.HALF_EVEN) を設定する必要があります。

于 2012-06-24T02:13:05.767 に答える