0

ヘッダーとトレーラー レコードを除く各詳細レコードに金額フィールドと数量フィールドが存在する csv ファイルがあります。トレーラ レコードには、詳細レコードの金額フィールドを乗じた数量の合計である合計料金値があります。トレーラーの合計料金の値が、金額フィールドと数量フィールドの計算値と等しいかどうかを確認する必要があります。これらすべての計算に double データ型を使用しています。私が閲覧したとき、以下のWebリンクから、小数点との比較中に二重データ型を使用すると問題が発生する可能性があることを理解できます。BigDecimal を使用することを提案しています

http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html

double データ型を使用すると問題が発生しますか? BigDecimal を使用して計算を行うにはどうすればよいですか。また、csvファイルの小数点以下の桁数がわかりません。また、金額には正または負の値を指定できます。

csvファイルで

H,ABC..... "D",....,"1","12.23" "D",.....,"3","-13.334" "D",.... ..、"2"、"12" T、csd、123、12.345

------------------------------ 検証中、私は以下のコードを持っています ------------ --------

                  double detChargeCount =0;

                  //From csv file i am reading trailer records charge value
                  String totChargeValue = items[3].replaceAll("\"","").trim();

                  if (null != totChargeValue && !totChargeValue.equals("")) {
                      detChargeCount = new Double(totChargeValue).doubleValue();

                  if(detChargeCount==calChargeCount)
                      validflag=true;

-------------------------------------- CSV ファイルの読み取り中に、以下のコードが表示されます

                   if (null != chargeQuan && !chargeQuan.equals("")) {
                          tmpChargeQuan=Long(chargeQuan).longValue();
                         }

                    if (null != chargeAmount && !chargeAmount.equals("")) {
                          tmpChargeAmt=new Double(chargeAmount).doubleValue();
                              calChargeCount=calChargeCount+(tmpChargeQuan*tmpChargeAmt);
                              }

   I had declared the variables  tmpChargeQuan, tmpChargeAmt,   calChargeCount  as double
4

2 に答える 2

1

特に財務データを扱うものは何でも、一般的に人間が読める数字を扱うものはすべて、その情報源が言うように、倍精度の代わりに BigDecimal を使用したいものです。

ドキュメントBigDecimal非常に簡単で、必要なものがすべて提供されているはずです。

int、double、および string コンストラクターがあるため、次のように簡単に作成できます。

BigDecimal detChargeCount = new BigDecimal(0);
...
detChargeCount = new BigDecimal(totChargeValue);

演算子は関数として実装されるため、次のようなことを行う必要があります

tmpChargeQuan.multiply(tmpChargeAmt)

の代わりにtmpChargeQun * tmpChargeAmt、しかしそれは大したことではありません。

しかし、それらはすべて、必要になる可能性のあるすべてのオーバーロードで定義されています。

于 2010-02-19T02:26:45.380 に答える
0

double で問題が発生する可能性は非常に高く、つまり、事前計算された値と新しく計算された値が .000001 以下異なる場合があります。

比較対象の値がどのように計算されたのかわからない場合は、「等しい」をイプシロン未満の差として定義するのが最善の解決策だと思います。ここで、イプシロンは .0001 などの非常に小さい数値です。

A == Bつまり、 testを使用するのではなく、 を使用しますabs(A - B) < .0001

于 2010-02-19T02:16:50.853 に答える