在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位小数。
任何建议都将不胜感激。
答案 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)
我认为rst
是ResultSet
。确保您使用的是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
。