[英]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.