2012-11-05 1 views
3

필자는 동작하지 않는 간단한 코드를 가지고 있습니다.자바 : 간단한 BigDecimal 논리적 오류

이 코드는 BigDecimal 배열을 추가하여 array.length로 나누어 평균을 찾습니다. 그러나 알고리즘의 첫 번째 단계에서는 배열을 올바르게 추가하지 못합니다 (변수 "sum").

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 

나는 그것의 간단한 오류 확신 해요,하지만 난 사전에 감사를 문제 주연의 피곤 해요 : 다음과 같이

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

출력이다.

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