2010-02-19 55 views
0

我有一个csv文件,其中的数量和数量字段出现在每个明细记录中,除了标题和预告记录。预告片记录具有总计费用值,这是总额详细记录中乘以数量字段的总和。我需要检查拖车总费用值是否等于我的数量和数量字段的计算值。我为所有这些计算使用双数据类型。当我浏览时,我能够从下面的网页链接了解到,它可能会在使用双数据类型时与小数点进行比较时产生问题。它建议使用的BigDecimal关于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 

回答

1

特别是对于任何具有财务数据,但一般情况下处理人类可读数字的任何事情,BigDecimal都是您想要使用的而不是双倍数据,就像该源代码所说。

BigDecimal上的documentation非常直观,并且应该提供您需要的一切。

它有一个INT,双,和字符串的构造函数,所以你可以简单地有:

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

的运营商正在实现的功能,所以你不得不做的事情一样

tmpChargeQuan.multiply(tmpChargeAmt)

而不是简单的tmpChargeQun * tmpChargeAmt,但这应该不是什么大不了的事。

但它们都用您可能需要的所有重载来定义。

+0

非常感谢您的信息 – Arav 2010-02-23 22:49:05

0

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

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

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

+0

非常感谢信息 – Arav 2010-02-23 22:49:24