我有一个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; 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发布于 2010-02-19 10:26:45
特别是对于任何具有财务数据的数据,但一般来说,对于处理人类可读数字的所有数据,BigDecimal是您想要使用的,而不是如该来源所说的双精度。
BigDecimal上的documentation非常简单,应该能提供您需要的一切。
它有一个int、double和string构造函数,因此您可以简单地拥有:
BigDecimal detChargeCount = new BigDecimal(0);
...
detChargeCount = new BigDecimal(totChargeValue);运算符是作为函数实现的,因此您必须执行以下操作
tmpChargeQuan.multiply(tmpChargeAmt)
而不是简单的tmpChargeQun * tmpChargeAmt,但这不应该是什么大问题。
但它们都定义了您可能需要的所有重载。
发布于 2010-02-19 10:16:51
你很可能会遇到doubles的问题,我指的是预先计算的值和新计算的值可能相差.000001或更少。
如果您不知道要比较的值是如何计算的,我认为最好的解决方案是将“等于”定义为差小于ε,其中epsilon是一个非常小的数字,如.0001。
也就是说,使用abs(A - B) < .0001而不是使用测试A == B。
https://stackoverflow.com/questions/2293557
复制相似问题