繁体   English   中英

BigDecimal错误

[英]BigDecimal Error

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

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

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并将代码更改为以下内容

      BigDecimal bd = new BigDecimal(k);
      bd = bd.setScale(2,BigDecimal.ROUND_UP);

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

问题1

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

 k  = 157.3
 bd = 157.31

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

任何原因显示为157.31

问题2

还有什么原因k显示这么多的十进制值? 下面是我得到的双变量k的不同值

157.3
67.09
1014.6000000000003
229.06999999999996

我不明白它有时会显示一个小数,有时显示2位小数,大部分时间显示14位小数。

任何建议将不胜感激。

您要通过仍在double 到处都坚持BigDecimal

BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(new BigDecimal(rst.getString(5));
}

或者 - 并且最好是,如果数据库中的字段实际上是十进制值:

BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(rst.getBigDecimal(5));
}

至于你的第二个问题, double是一个二进制 浮点数 这意味着它表示为两个幂的总和。 不要用它们来计算货币价值。 (如果这就是你在那里总结的那些)。 BigDecimal使用十进制算术,因此这与我们使用的更符合。

诸如0.1类的数字是二进制的无限分数,在这种情况下: 0.000110011...因此,使用double无法获得可靠而精确的结果。

我假设rst是一个ResultSet 确保使用的是getBigDecimal而不是Double.parseDouble(rst.getString(5))

BigDecimal k = BigDecimal.ZERO;
while(rst.next()) {
  k = k.add(rst.getBigDecimal(5));
}

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

使用BigDecimal.ROUND_HALF_UP(或.._ DOWN或.._ EVEN)。

浮点计算本质上是不准确的,并且累积的小错误。 这就是为什么你的最终结果是少量的。 如果你总是向上舍入,像1.0000000001这样的小的正误差就变成了1.01。

或者,您也可以使用BigDecimal进行计算。 这样一来,你不会在最终结果中出现错误。 只需记住使用BigDecimal(String)构造函数,或直接从结果集中获取BigDecimal。

你需要将k作为BigDecimal ,而不是double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM