题
我有一个csv文件,其中的金额和数量字段存在于除首部和尾部的每个记录明细记录。拖车记录有一个总电荷值是量详细记录乘以量字段的总和。我需要检查一下拖车的总电荷值是否等于我计算的金额和数量字段的值。我使用所有这些计算双数据类型。当我浏览,我能够从下面的网站链接,了解它可能创建一个使用双数据类型,同时带有小数点比较的问题。它建议使用的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
解决方案
特别是对于财务数据的任何东西,但总的来说一切交易与人类可读的数字,BigDecimal的是你想要什么,而不是使用双,就像当年源说。
在文档上BigDecimal
是相当直接的,并应提供你需要的一切。
它有一个INT,双,和字符串的构造函数,所以你可以简单地有:
BigDecimal detChargeCount = new BigDecimal(0);
...
detChargeCount = new BigDecimal(totChargeValue);
在运营商实现的功能,所以你不得不做的事情一样。
tmpChargeQuan.multiply(tmpChargeAmt)
而不是简单地tmpChargeQun * tmpChargeAmt
,但是这不应该是一个大问题。
但是他们都定义了所有你能需要以及重载。
其他提示
这是非常可能的,你将有双打的问题,我指的是预先计算值与新计算出的值可以通过.000001以下是不同的。
如果你不知道你是如何比较值来计算被做,我认为最好的办法是定义“平等”为小于ε,其中小量是一个非常小的数目等.0001,会将差异
即。而不是使用测试A == B
,使用abs(A - B) < .0001
。