2012-01-17 16 views
3

、私はKを表示すると、私は、BigDecimalのエラーJavaでは

while(rst.next()) { 
k = k + Double.parseDouble(rst.getString(5)); 
} 

NOTE: In database, I have values as 125.23, 458.45, 665.99 (all two decimals)

をデータベースからデータを取得し、whileループを使用して同じことを追加してい double k=0.0;

としてKを定義しています私は価値が得られる

k = 6034.299999999992

そこで私はBigDecimalを導入し、今、私が正しいとするbd=6034.30として新しい合計を取得

 BigDecimal bd = new BigDecimal(k); 
     bd = bd.setScale(2,BigDecimal.ROUND_UP); 

以下にコードを変更しました。

は問題私は、下記の他の場所で同じ使用しているときに問題がある1

まあ、私は私が157.30を得ることが手動で追加した後などbd=157.30を示しているはず

k = 157.3 
bd = 157.31 

を取得していますものです。

157.31と表示されている理由は何ですか?

問題2

また、kは非常に多くの小数点以下の値を示している理由は、何らかの理由?以下 は、私は二重の変数k

157.3 
67.09 
1014.6000000000003 
229.06999999999996 

のために取得しています異なる値であり、私はいつかそれが2進を表示し、ほとんどの時間は、それが14進値を示し、それは小数点以下を表示いつか理解していません。

ご迷惑をおかけして申し訳ございません。

+0

なぜあなたは、丸めのためにこの答えのような何か?: を別の関数を定義しないhttp://stackoverflow.com/a/8911683/744859 、人々がで示唆としてのBigDecimalとしてKを定義しますクリーンで効率的なコードを持っているとコメントしています。 –

+0

@Jav_Rock:私は関数を使用していますが、ここではコードを提示したことを説明するために...詳細情報が必要な場合はお知らせください... –

答えて

7

からdoubleを経由しています。

BigDecimal k = BigDecimal.ZERO; 
while (rst.next()) { 
    k = k.add(rst.getBigDecimal(5)); 
} 
0

doubleの代わりにkBigDecimalとする必要があります。

2

使用BigDecimal.ROUND_HALF_UP(または.._ DOWNまたは..:データベース内のフィールドは、実際に小数値であれば、できれおよび -

また
BigDecimal k = BigDecimal.ZERO; 
while (rst.next()) { 
    k = k.add(new BigDecimal(rst.getString(5)); 
} 

を:どこでもBigDecimalにこだわります_EVEN)。

浮動小数点計算は本質的に不正確で、小さな誤差が累積します。だからあなたの最終的な結果は少量ではありません。常に切り上げると、1.0000000001のような小さな正のエラーが1.01になります。

また、計算にもBigDecimalを使用できます。あなたが最初の場所で最終結果にエラーを持っていないようにそのように。 BigDecimal(String)コンストラクタを使用するか、結果セットから直接BigDecimalを取得することを忘れないでください。

6

はあなたの2番目の質問については、doubleバイナリ浮動小数点数です。これは、2の累乗で表されることを意味します。 金額を計算するためにそれらを使用しないでください。(それがあなたがそこで集計しているものなら)。 BigDecimalはの十進数算術を使用しているため、これは私たちが使用しているものと一直線になっています。

0.1のような数値は、バイナリの無限小数部です。この場合は0.000110011...です。doubleを使用すると、信頼できる正確な結果を得ることができません。

+0

ありがとうございました.... –

3

rstResultSetと仮定します。

BigDecimal k = BigDecimal.ZERO; 
while(rst.next()) { 
    k = k.add(rst.getBigDecimal(5)); 
} 

そして、すべての最初に:あなたはDouble.parseDouble(rst.getString(5))ではなくgetBigDecimalを使用していることを確認しを使用すると、適切なSQL SUMクエリを使用して直接データベースでこれらの数字を追加していない理由は?これにより

+0

私は総給与を表示したい会社の全従業員を表示して合計を実行すると、もう一度クエリを実行しなければならないので、whileループでは、2番目のクエリを追加せずに目的の結果を追加しようとしていました.... –