2012-06-24 5 views
7

BigDecimalを使用して、2桁に丸められた2つの通貨の値を比較することを考えています。例えば、私は、0.02になるべきものと0.02の何かを比較しているので、以下のように0を返すと思います。しかし、それは-1をもたらす!これを行う正しい方法がありますか?JavaのBigDecimal

これは、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)); 

答えて

5

0.02はsetScale(2、RoundingMode.HALF_EVEN)に

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

あなたが持っていると評価されますが、あまりにも。

+0

それは、正確な浮動小数点数を得る別の方法です。 1+。 –

+0

両方のアイディアをここに使って、正しく理解していなければならなかった。正しいコードを投稿します。 – fodon

10

まず第一に、BigDecimalのは不変です。あなたはsetScaleメソッド呼び出しから結果を返す必要があります。それは、二重に由来しているので、

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

次はあなたが二BigDecimalのあなたの精度を向上させる必要があります - ではない非常に正確なエンティティ。だから、文字列を試してみてください。

spread.compareTo(new BigDecimal("0.02")) 
+0

これは実際に価格を比較するために使用されます。彼らは倍からインスタンス化する必要があります。 – fodon

+0

@fodon:あなたの答えがあなたのために不明であり、私はもう一つの部分があります(BigDecimalは不変です)。 –

+1

私は無効な編集を元に戻しました。あなたが見る答えに満足できない場合は、皆さん、_comment_または_additional回答_を提供してください。 –

関連する問題