Относительно BigDecimal - PullRequest
       7

Относительно BigDecimal

0 голосов
/ 19 февраля 2010

У меня есть CSV-файл, в котором поля количества и количества присутствуют в каждой подробной записи, кроме заголовка и записи трейлера. У записи трейлера есть значения полной оплаты, которые являются общей суммой количества, умноженного на поле количества в подробных записях Мне нужно проверить, равно ли значение полной оплаты прицепа моим расчетным значениям полей количества и количества. Я использую двойной тип данных для всех этих расчетов. При просмотре я могу понять из приведенной ниже веб-ссылки, что это может создать проблему с использованием двойного типа данных при сравнении с десятичными точками. Он предлагает использовать 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" Т, 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

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Особенно для всего, что связано с финансовыми данными, но в целом для всего, что связано с удобочитаемыми числами, BigDecimal - это то, что вы хотите использовать вместо double, как говорит этот источник.

Документация на BigDecimal довольно проста и должна содержать все, что вам нужно.

Он имеет конструкторы типа int, double и string, поэтому вы можете просто иметь:

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

Операторы реализованы в виде функций, поэтому вам придется делать такие вещи, как

tmpChargeQuan.multiply(tmpChargeAmt)

вместо простого tmpChargeQun * tmpChargeAmt, но это не должно иметь большого значения.

но все они определены со всеми необходимыми перегрузками.

0 голосов
/ 19 февраля 2010

Вполне возможно, что у вас возникнут проблемы с двойными числами. Я имею в виду, что предварительно вычисленное значение и новое вычисленное значение могут отличаться на .000001 или менее.

Если вы не знаете, как вычислялось значение, с которым вы сравниваете, я думаю, что лучшее решение - это определить «равный» как имеющий разницу меньше, чем эпсилон, где эпсилон - очень небольшое число, такое как .0001 .

т.е. вместо теста A == B используйте abs(A - B) < .0001.

...