Frage

Ich habe eine CSV-Datei, in der Menge und Mengenfelder vorhanden sind, in jedem Detail Record außer Header und Trailer Rekord. Nachsatz hat eine Gesamtladungswerte, die die Gesamtsumme der Menge von Betragsfeld im Detail Records multipliziert wird. Ich muss überprüfen, ob der Anhänger Gesamtladungswert zu meinem berechneten Wert der Menge und Mengenfeldern entspricht. Ich bin mit dem doppelten Datentyp für all diese Berechnungen. Wenn ich durchsuchte ich bin in der Lage von dem unter Web-Link zu verstehen, dass es möglicherweise ein Problem mit doppeltem Datentyp, während Vergleich mit Dezimalstellen erstellen. Es wird darauf hindeutet, zu verwenden BigDecimal

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

Bekomme ich Probleme, wenn ich doppelten Datentyp verwenden. Wie kann ich die Berechnungen mit BigDecimal tun. Auch ich bin nicht sicher, wie viele Ziffern i nach Dezimalstellen in CSV-Datei erhalten. Betrag kann auch einen positiven oder negativen Wert hat.

In CSV-Datei

H, ABC ..... "D", ...., "1", "12,23" "D", ..... "3", "- 13,334" "D", ......, "2", "12" T, csd, 123,12.345

------------------------------ Während Validation i die folgenden Code habe --------- -----------

                  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;

----------------------- Beim Lesen CSV-Datei Ich habe die folgenden Code

                   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
War es hilfreich?

Lösung

Speziell für alles, was mit Finanzdaten, aber im Allgemeinen für allen Umgang mit Menschen lesbaren Zahlen, BigDecimal ist, was Sie statt Doppel verwenden mögen, so wie die Quelle sagt.

Die Dokumentation auf BigDecimal ist ziemlich geradlinig und soll alles, was Sie zur Verfügung stellen müssen.

Es hat einen int, double und String Bauer, so können Sie einfach haben:

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

Die Betreiber als Funktionen implementiert, so dass Sie Dinge tun müssen, würde wie

tmpChargeQuan.multiply(tmpChargeAmt)

anstatt einfach tmpChargeQun * tmpChargeAmt, aber das ist keine große Sache sein sollte.

, aber sie sind alle mit allen Überlastungen definiert man auch braucht.

Andere Tipps

Es ist durchaus möglich, dass Sie Probleme mit Doppel haben wird, von dem ich den vorberechneten Mittelwert und der neu berechnete Wert kann von 0,000001 oder weniger unterscheiden.

Wenn Sie nicht wissen, wie sich der Wert Sie vergleichen berechnet wurde, glaube ich, die beste Lösung zu definieren ist „gleich“, wie eine Differenz von weniger als Epsilon hat, wobei Epsilon eine sehr kleine Zahl wie .0001 ist .

d. anstatt den Test A == B, Verwendung abs(A - B) < .0001 verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top