在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个小数点值。
如有任何建议,将不胜感激。
发布于 2012-01-17 08:02:27
你还在通过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));
}发布于 2012-01-17 08:03:09
关于第二个问题,double是一个二进制浮点数。这意味着它被表示为两次幂之和。永远不要用这些来计算货币价值。(如果这就是你在总结的话)。BigDecimal使用十进制算术,所以这更符合我们使用的内容。
像0.1这样的数字是二进制的无限分数,在本例中是:0.000110011...,因此使用double无法得到可靠和准确的结果。
发布于 2012-01-17 08:04:21
我猜想rst是ResultSet。确保您使用的是getBigDecimal而不是Double.parseDouble(rst.getString(5))
BigDecimal k = BigDecimal.ZERO;
while(rst.next()) {
k = k.add(rst.getBigDecimal(5));
}首先:,为什么不使用适当的SQL SUM查询直接在数据库中添加这些数字?
https://stackoverflow.com/questions/8891318
复制相似问题