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

BigDecimal错误
EN

Stack Overflow用户
提问于 2012-01-17 07:58:03
回答 5查看 4.3K关注 0票数 6

在Java中,我将k定义为double k=0.0;

我从数据库获取数据,并使用while循环添加相同的数据,

代码语言:javascript
复制
while(rst.next()) {
k = k + Double.parseDouble(rst.getString(5));
}

NOTE: In database, I have values as 125.23, 458.45, 665.99 (all two decimals)

当我显示k时,我得到的价值是

k = 6034.299999999992

因此,我引入了BigDecimal并将代码更改为下面的代码

代码语言:javascript
复制
      BigDecimal bd = new BigDecimal(k);
      bd = bd.setScale(2,BigDecimal.ROUND_UP);

现在我得到了新的总数作为bd=6034.30,这是正确的。

问题1

问题是当我在其他地方使用相同的东西时,下面是我得到的

代码语言:javascript
复制
 k  = 157.3
 bd = 157.31

它应该显示bd=157.30,因为在手动添加之后,我得到了157.30

它以157.31的形式出现的任何原因。

问题2

为什么k会显示这么多十进制值呢?下面是双变量k的不同值

代码语言:javascript
复制
157.3
67.09
1014.6000000000003
229.06999999999996

我不明白有时它会显示一个小数点,有时它会显示2个小数点,而大多数时候它会显示14个小数点值。

如有任何建议,将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-17 08:02:27

你还在通过double。在任何地方都坚持BigDecimal

代码语言:javascript
复制
BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(new BigDecimal(rst.getString(5));
}

或者,如果数据库中的字段实际上是一个十进制值,则最好是:

代码语言:javascript
复制
BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(rst.getBigDecimal(5));
}
票数 7
EN

Stack Overflow用户

发布于 2012-01-17 08:03:09

关于第二个问题,double是一个二进制浮点数。这意味着它被表示为两次幂之和。永远不要用这些来计算货币价值。(如果这就是你在总结的话)。BigDecimal使用十进制算术,所以这更符合我们使用的内容。

0.1这样的数字是二进制的无限分数,在本例中是:0.000110011...,因此使用double无法得到可靠和准确的结果。

票数 6
EN

Stack Overflow用户

发布于 2012-01-17 08:04:21

我猜想rstResultSet。确保您使用的是getBigDecimal而不是Double.parseDouble(rst.getString(5))

代码语言:javascript
复制
BigDecimal k = BigDecimal.ZERO;
while(rst.next()) {
  k = k.add(rst.getBigDecimal(5));
}

首先:,为什么不使用适当的SQL SUM查询直接在数据库中添加这些数字?

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

https://stackoverflow.com/questions/8891318

复制
相关文章

相似问题

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