关于BigDecimal

时间:2010-02-19 01:41:40

标签: double bigdecimal

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

2 个答案:

答案 0 :(得分:1)

特别是对于任何有财务数据的东西,但一般来说只涉及人类可读数字的一切,BigDecimal就是你要用而不是双倍的东西,就像那个来源说的那样。

BigDecimal上的documentation非常简单,应该提供您需要的一切。

它有一个int,double和string构造函数,所以你只需要:

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

运算符是作为函数实现的,因此您必须执行

之类的操作

tmpChargeQuan.multiply(tmpChargeAmt)

而不仅仅是tmpChargeQun * tmpChargeAmt,但这应该不是什么大问题。

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

答案 1 :(得分:0)

你很可能遇到双打问题,我的意思是预先计算的值和新计算的值可能相差.000001或更低。

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

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