質問

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

を使用するように示唆されています

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

私は二重のデータ型を使用する場合は、

は、私が問題を取得します。私は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
役に立ちましたか?

解決

特に財務データを使って何のために、しかし、人間が読める数字を扱うすべてのため、一般的に、BigDecimalのは、あなたの代わりに、二重の使用したいものであるソースは述べているだけのようます。

ドキュメントは上のBigDecimalはかなり単純明快で、あなたが必要なすべてを提供する必要があります。

これは、int型、ダブル、および文字列コンストラクタを持っているので、あなたは、単に持つことができます:

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

演算子は関数として実装されているので、あなたは、

のようなことを行う必要があるだろう

tmpChargeQuan.multiply(tmpChargeAmt)

代わりに、単にtmpChargeQun * tmpChargeAmt

が、それは大したことではないはずです。

が、それらはすべてあなたがよくとして必要とすることができるすべてのオーバーロードを使用して定義しています。

他のヒント

それはあなたが、私は事前に計算された値を意味し、新たに計算された値が0.000001以下で異なる場合があることにより、ダブルスの問題を、持っていることは非常に可能です。

あなたが比較されている値が計算された方法がわからない場合は、

は、私は最善の解決策は、イプシロンは0.0001と非常に少ない数などであるイプシロン未満の差を有するよう「等しい」を定義することだと思いますます。

すなわち。むしろテストA == B、使用abs(A - B) < .0001を使用するよります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top