首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于BigDecimal

关于BigDecimal
EN

Stack Overflow用户
提问于 2010-02-19 09:41:40
回答 2查看 381关注 0票数 0

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

代码语言:javascript
复制
                  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;

代码语言:javascript
复制
                   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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-19 10:26:45

特别是对于任何具有财务数据的数据,但一般来说,对于处理人类可读数字的所有数据,BigDecimal是您想要使用的,而不是如该来源所说的双精度。

BigDecimal上的documentation非常简单,应该能提供您需要的一切。

它有一个int、double和string构造函数,因此您可以简单地拥有:

代码语言:javascript
复制
BigDecimal detChargeCount = new BigDecimal(0);
...
detChargeCount = new BigDecimal(totChargeValue);

运算符是作为函数实现的,因此您必须执行以下操作

tmpChargeQuan.multiply(tmpChargeAmt)

而不是简单的tmpChargeQun * tmpChargeAmt,但这不应该是什么大问题。

但它们都定义了您可能需要的所有重载。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 10:16:51

你很可能会遇到doubles的问题,我指的是预先计算的值和新计算的值可能相差.000001或更少。

如果您不知道要比较的值是如何计算的,我认为最好的解决方案是将“等于”定义为差小于ε,其中epsilon是一个非常小的数字,如.0001。

也就是说,使用abs(A - B) < .0001而不是使用测试A == B

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2293557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档