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