关于大十进制

时间:2010-03-01 01:34:09

标签: java double bigdecimal

我有一个csv文件,其中每个详细记录中都有数量和数量字段,但标题和预告片记录除外。预告片记录具有总费用值,即总计数量乘以详细记录中的数量字段。我需要检查拖车总费用值是否等于我计算的金额和数量字段的值。我正在使用双数据类型进行所有这些计算

在csv文件中,金额字段显示为“10.12”或“10”或“10.0”或“10.456”或“10.4555”或“-10.12”。金额也可以有正值或负值。

在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); 
                          } 

我已将变量tmpChargeQuan,tmpChargeAmt,calChargeCount声明为double

当我搜索网页时,我发现双重可能会给出财务计算问题,因此需要使用BIGDECIMAL。但我想知道这种情况是否适用于我的计算。在我的情况下,金额值可以在小数点后最多5或6位数“我可以使用双数据类型进行此计算吗?我正在使用它进行验证。如果我使用上面的代码并使用double进行乘法,会产生问题吗? / p>

2 个答案:

答案 0 :(得分:4)

我将扩展阿德尔已经解决的问题。您可以将这些数字拟合为double数据类型。问题是当计算数字时,它们会被正确计算吗?答案是否定的 - 他们不会。一般来说,如果你考虑到delta的问题并没有那么大的问题,也就是说,你假设一个double值是否等于另一个double值。但是对于涉及精确数字的计算,例如货币计算,您必须使用BigDecimal等类型来保存值。

当你有这个号码时: 1.23445 作为双倍,它可能看起来像1.23445 但它实际上可能是这样的 1.234450000003400345543034

当您对诸如此类的数字执行多次计算时,通常这些额外的位置无关紧要 - 但是,随着时间的推移,它们将产生不准确的结果。使用BigDecimal,当一个数字被指定为它的字符串表示时,它 那个数字 - 它不会遭受双重“几乎同样好”的问题。

我正在更新此答案,以包含BigDecimal的双构造函数中的一些注释,可在此address找到。

  

这个构造函数的结果可以是   有点不可预测。有人可能   假设写新   Java中的BigDecimal(0.1)创建了一个   BigDecimal完全等于   0.1(未缩放值为1,刻度为1),但实际上是相等的   至   0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能   完全代表双重(或,   就此而言,作为二元分数   任何有限长度)。因此,价值   正在被传递到   构造函数不完全等于   0.1,尽管有外表。

     

String构造函数,另一方面   手,完全可以预测:   写新的BigDecimal(“0.1”)创建   一个完全等于的BigDecimal   0.1,正如人们所期望的那样。因此,一般建议使用   可以使用字符串构造函数   偏爱这个。

     

必须使用double作为源   对于BigDecimal,请注意这一点   构造函数提供了精确的   转换;它没有给出相同的   结果将double转换为a   字符串使用   Double.toString(double)方法和   然后使用BigDecimal(String)   构造函数。要获得该结果,请使用   静态valueOf(double)方法。

答案 1 :(得分:2)

它不是尺寸问题,而是完全表达浮点数的问题。 How the BigDecimal Class Helps Java Get its arithmetic right