BigDecimal错误

Fah*_*kar 5 java floating-point double bigdecimal

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

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

while(rst.next()) {
k = k + Double.parseDouble(rst.getString(5));
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

现在我得到新的总数bd=6034.30是正确的.

问题1

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

 k  = 157.3
 bd = 157.31
Run Code Online (Sandbox Code Playgroud)

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

任何原因显示为157.31.

问题2

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

157.3
67.09
1014.6000000000003
229.06999999999996
Run Code Online (Sandbox Code Playgroud)

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

任何建议将不胜感激.

Jon*_*eet 7

你还是会通过 double.坚持BigDecimal 到处:

BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(new BigDecimal(rst.getString(5));
}
Run Code Online (Sandbox Code Playgroud)

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

BigDecimal k = BigDecimal.ZERO;
while (rst.next()) {
    k = k.add(rst.getBigDecimal(5));
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*oey 6

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

0.1在这种情况下,数字如二进制中的无限分数:0.000110011...因此您无法从使用中获得可靠且精确的结果double.