BigDecimal错误

时间:2012-01-17 07:58:03

标签: java floating-point double bigdecimal

在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位小数。

任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:7)

你仍然通过 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));
}

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

您需要k作为BigDecimal,而不是double