我有一个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
答案 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
。