2012-11-05 79 views
3

我有一段简单的代码并不像应该那样运行。Java:简单的BigDecimal逻辑错误

这段代码试图添加一个BigDecimals数组,然后除以array.length来找到一个平均值。但是,算法的第一阶段无法正确地将数组添加到一起(在变量“sum”中)。

public BigDecimal getAverageHeight() 
{ 
    BigDecimal sum = new BigDecimal(0); 
    BigDecimal[] heights = getAllHeights(); 

    for (int a = 0; a < heights.length; a++) 
    { 
     sum.add(heights[a]); 
     System.out.println("Height[" + a + "] = " + heights[a]); 
     System.out.println("Sum = " + sum.setScale(2, BigDecimal.ROUND_HALF_UP)); 
    }   

    return sum.divide(new BigDecimal(heights.length)); 
} 

输出如下:

Height[0] = 24 
Sum = 0.00 
Height[1] = 24 
Sum = 0.00 
Height[2] = 24 
Sum = 0.00 
Height[3] = 26 
Sum = 0.00 
Height[4] = 26 
Sum = 0.00 
Height[5] = 26 
Sum = 0.00 

我敢肯定它的一个简单的错误,但我提前累了这个问题主演的,谢谢。

+1

为了将来的参考,您的问题通过阅读Javadoc解决。 –

回答

5

BigDecial.add()回报的总和,它改变它。这样做:

sum = sum.add(heights[a]); 
+1

不可改变的价值等级问题......是的,它是新玩家的陷阱,我们的程序员都是新玩家......不断开始,偶尔也会获得经验。叹。 – corlettk

4

BigDecimal对象是不可改变的,所有的方法修改它的值返回一个新的BigDecimal对象。新创建的对象包含修改后的值。

你需要做这样的事情:

sum = sum.add(heights[a]); 

这也无二setScale()divide()操作

+1

我知道这将是一个愚蠢的错误!谢谢。 – cworner1

+1

但容易修复... – Frank

1

总和的加法运算的结果值分配回变量和

for (int a = 0; a < heights.length; a++) 
    { 
     sum = sum + heights[a]; 
     System.out.println("Height[" + a + "] = " + heights[a]); 
     System.out.println("Sum = " + sum.setScale(2, BigDecimal.ROUND_HALF_UP)); 
    }