题
我有一个 csv 文件,其中除标题和尾部记录之外的每个详细记录中都存在金额和数量字段。拖车记录有一个总费用值,它是数量总和乘以详细记录中的金额字段。我需要检查拖车总费用值是否等于我计算的金额和数量字段的值。我在所有这些计算中使用双精度数据类型
在 csv 文件中,金额字段显示为“10.12”或“10”或“10.0”或“10.456”或“10.4555”或“-10.12”。金额也可以有正值或负值。
在 csv 文件中
哈,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
当我搜索网络时,我发现 double 可能会给财务计算带来问题,因此需要使用 BIGDECIMAL。但我想知道这种情况是否适用于我的计算。在我的例子中,金额值小数点后最多可以有 5 或 6 位数字”我可以使用双精度数据类型进行此计算吗?我用它来验证。如果我将上面的代码与双精度乘法一起使用,会产生问题吗?
解决方案
我将扩展阿迪尔已经简洁回答的内容。您可以将这些数字放入双精度数据类型中。问题是当数字被计算时,它们会被正确计算吗?答案是否定的——他们不会。一般来说,如果您用增量来解释这一点,那么这并不是什么大问题,也就是说,您在假设一个双精度值是否等于另一个双精度值时有余地。但对于涉及精确数字的计算(例如货币计算),您必须使用 BigDecimal 等类型来保存值。
当你有这个号码时:1.23445作为双重,看起来像1.23445,但实际上可能是1.2344500000034003454334
当您对此类数字执行多次计算时,通常那些额外的位置并不重要 - 但是,随着时间的推移,它们会产生不准确的结果。使用 BigDecimal,当将数字指定为其字符串表示形式时,它 是 这个数字 - 它不会遇到双打所遇到的“几乎一样好”的问题。
我正在更新这个答案,以包含 BigDecimal 的双重构造函数的一些注释,可以在此处找到 地址.
该构造函数的结果可能是不可预测的。可以假设,在Java中编写新的BigDecimal(0.1)会产生一个bigdecimal,其恰好等于0.1(未量的值为1,比例为1),但实际上等于0.1000000000000000000555555555511515123123125782782782702118211815815834055625。这是因为0.1不能完全表示为双重(或为此,是任何有限长度的二进制部分)。因此,尽管外观,传递给构造函数的值并不完全等于0.1。
另一方面,字符串构造函数是完全可以预见的:正如人们所期望的那样,编写新的BigDecimal(“ 0.1”)创造了一个完全等于0.1的BigDecimal。因此,通常建议将字符串构造函数用于优先考虑。
如果必须将双重命名用作大截然不同的源,请注意,该构造函数提供了精确的转换;它与使用double.tostring(double)方法然后使用BigDecimal(String)构造函数将双重转换为字符串的结果相同。要获得结果,请使用静态值(双)方法。
其他提示
它不是大小,它的准确表达浮点数的物质的物质。 如何BigDecimal类的Java帮助其获取算术右移。