Java:简单的BigDecimal逻辑错误

时间:2012-11-05 10:25:17

标签: 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

我确定这是一个简单的错误,但我已经厌倦了主演这个问题,提前谢谢。

3 个答案:

答案 0 :(得分:5)

BigDecial.add() 返回总和,更改它。这样做:

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

答案 1 :(得分:4)

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

你需要做这样的事情:

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

这也适用于setScale()divide()操作

答案 2 :(得分:1)

将sum的加法运算的结果值分配回变量sum

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));
    }