0

我有一个 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
4

2 回答 2

1

特别是对于任何具有财务数据的事物,但通常对于处理人类可读数字的所有事物,BigDecimal 是您想要使用的,而不是 double,正如该消息来源所说。

上的文档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

您很可能会遇到双精度问题,我的意思是预先计算的值和新计算的值可能相差 0.000001 或更小。

如果您不知道要比较的值是如何计算的,我认为最好的解决方案是将“相等”定义为差异小于 epsilon,其中 epsilon 是一个非常小的数字,例如 0.0001。

即,而不是使用测试A == B,使用abs(A - B) < .0001.

于 2010-02-19T02:16:50.853 回答