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位小数.
任何建议将不胜感激.
你还是会通过 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)
至于你的第二个问题,double是一个二进制浮点数.这意味着它表示为两个幂的总和.不要用它们来计算货币价值.(如果这就是你在那里总结的那些).BigDecimal使用十进制算术,因此这与我们使用的更符合.
0.1在这种情况下,数字如二进制中的无限分数:0.000110011...因此您无法从使用中获得可靠且精确的结果double.