2012-01-17 63 views
3

在Java中,我已经定义k作为 double k=0.0;BigDecimal的错误

我从数据库中获取数据和添加相同的使用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

你为什么不定义一个单独的函数在这个答案?: http://stackoverflow.com/a/8911683/744859 有了这个四舍五入,像和定义k作为BigDecimal的,因为人们认为在评论你会有一个干净和高效的代码。 – 2012-01-18 15:40:47

+0

@Jav_Rock:我使用的功能,但这里要说明一下,我只给出代码...让我知道柜面的任何进一步的细节需要... – 2012-01-18 15:47:00

回答

7

你仍然要通过double。坚持BigDecimal到处

BigDecimal k = BigDecimal.ZERO; 
while (rst.next()) { 
    k = k.add(new BigDecimal(rst.getString(5)); 
} 

或者 - 和preferrably,如果在数据库中的字段实际上是一个十进制值:

BigDecimal k = BigDecimal.ZERO; 
while (rst.next()) { 
    k = k.add(rst.getBigDecimal(5)); 
} 
0

您还需要k作为BigDecimal,而不是double

2

使用BigDecimal.ROUND_HALF_UP(或.._ DOWN或.. _甚至)。

浮点计算本质上是不准确的,小误差会累积。这就是为什么你的最终结果是少量的。如果你总是四舍五入,像1.0000000001这样的小错误就会变成1.01。

或者,您也可以使用BigDecimal进行计算。这样你就不会在最终结果中出现错误。请记住使用BigDecimal(String)构造函数,或直接从结果集中获取BigDecimal。

6

关于你的第二个问题,double二进制浮点号。这意味着它被表示为两个幂的和。 千万不要用这些来计算货币价值。(如果这就是你在那里总结的话)。 BigDecimal使用十进制算术,所以这更符合我们的使用。

0.1等数字是二进制无限分数,在这种情况下:0.000110011...因此,您不能从使用double获得可靠和准确的结果。

+0

感谢资讯.... – 2012-01-17 08:56:51

3

我假设rstResultSet。请确保您使用的getBigDecimal而不是Double.parseDouble(rst.getString(5))

BigDecimal k = BigDecimal.ZERO; 
while(rst.next()) { 
    k = k.add(rst.getBigDecimal(5)); 
} 

而且首先:你为什么不直接在数据库中使用适当的SQL查询SUM添加这些数字呢?

+0

我想显示的总工资,而显示公司的所有员工...执行总和,我将不得不再次查询,因此在while循环本身,我试图添加并获得所需的结果没有第二个查询.... – 2012-01-17 08:51:05