Odnośnie BigDecimal

głosy
0

Mam pliku csv, gdzie wysokość i ilość pola są obecne w każdym rekordzie szczegółów oprócz nagłówka i zapis przyczepy. rekord przyczepa ma całkowitą wartości ładunku, który jest sumą ilości pomnożonej przez kwotę w polu szczegółów rekordów. Muszę sprawdzić, czy przyczepa łączna wartość opłata jest równa mojej obliczonej wartości kwoty i ilości pól. Używam podwójnego typ danych dla wszystkich tych obliczeń. Kiedy przeglądałem jestem w stanie zrozumieć z poniższego linku internetowej, że może stworzyć problem przy użyciu podwójnego typ danych podczas porównania z miejsc po przecinku. To sugeruje, aby przy użyciu BigDecimal

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

Będę się problemy, jeśli mogę użyć podwójnego typ danych. Jak mogę zrobić obliczenia wykorzystujące BigDecimal. Również nie jestem pewien, ile cyfr i dostanie po przecinku punktów w pliku csv. Również ilość może mieć wartość dodatnią lub ujemną.

W pliku csv

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

------------------------------ Podczas walidacji ja mam poniższy kod ------------ --------

                  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;

----------------------- Podczas czytania pliku CSV i mam poniższy kod

                   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
Utwórz 19/02/2010 o 00:41
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Jest bardzo możliwe, że masz problemy z podwójnych, przez co rozumiem wartość precomputed i nowo obliczona wartość może różnić się o .000001 lub mniej.

Jeśli nie wiesz, w jaki sposób wartość porównujesz do obliczono, myślę, że najlepszym rozwiązaniem jest określenie „równe”, jak o różnicę mniejszą niż epsilon, gdzie epsilon jest bardzo mała liczba takich jak 0,0001.

Czyli raczej niż za pomocą testu A == B, należy użyć abs(A - B) < .0001.

Odpowiedział 19/02/2010 o 01:16
źródło użytkownik

głosy
1

Specjalnie dla niczego z danymi finansowymi, ale generalnie za wszystko czynienia z liczbami czytelnych człowieka, BigDecimal jest to, co chcesz używać zamiast podwójne, jak mówi, że źródło.

Dokumentacja na BigDecimaljest dość prosta i powinna zapewnić wszystko, czego potrzebujesz.

Ma int, podwójne i konstruktorów ciągów, więc można po prostu:

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

Operatorzy są zaimplementowane jako funkcje, więc trzeba by robić takie rzeczy jak

tmpChargeQuan.multiply(tmpChargeAmt)

zamiast po prostu tmpChargeQun * tmpChargeAmt, ale to nie powinno być wielkiego.

ale wszystkie one są zdefiniowane wszystkie przeciążeń, co trzeba, jak również.

Odpowiedział 19/02/2010 o 01:26
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more