2014-12-13 3 views
0

BigDecimal을 사용하여 GST 세율을 계산하려고합니다.BigDecimal division

세금 계산은 1/11 * 항목 가격으로되어 있습니다.

그래서 가장 정확한 표현을하기 위해 BigDecimal을 사용해야한다고 생각했습니다. 그러나 어떤 이유로 든 비율은 항상 0으로 계산됩니다.

BigDecimal TAX_RATE = new BigDecimal("1") 
    .divide(new BigDecimal("11"), BigDecimal.ROUND_HALF_UP); 
BigDecimal bd = new BigDecimal("10").multiply(TAX_RATE); 
// gives 0 

사람이 왜 알고 있나요 :

이 내가 해봤 무엇인가?

+0

매우 작은 값이지만, 염두에 두어야 할 것이 있습니다. BigDecimal.ONE과 BigDecimal.TEN은 상수로 존재합니다. 10을 곱하기보다는 scaleByPowerOfTen ([javadoc] (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#scaleByPowerOfTen (int)))을 유용하게 사용할 수 있습니다. . 그래도 문제는 당신과 관련이 없습니다. –

+0

1/11을 나타내는 값을 곱하는 대신 항목 가격을 11로 나누면 더 정확한 결과를 얻을 수 있습니다. 이는 컴퓨터가 전체 반복 소수를 저장할 수있는 메모리가 충분하지 않기 때문에 'BigDecimal'이 정확히 1/11 (.090909090 ...)을 나타낼 수 없기 때문입니다. :) 궁극적으로 항목 가격이 충분히 크면 반올림 오류가 발생합니다. – ajb

+0

감사합니다. 예, 가격을 11로 나눌 코드를 수정합니다. 좋은 아이디어입니다. 마이클 - "10"은 계산과 관련이 없으며 단지 임의적입니다. 단지 샘플 일뿐입니다. 건배. –

답변

1

BigDecimal TAX_RATE = new BigDecimal("1").divide(new BigDecimal("11"), 500, BigDecimal.ROUND_HALF_UP); 

두 번째 인수는 정밀도를 지정하십시오 참조하십시오. 기본적으로 0이므로 모든 것을 int로 반올림합니다.

+0

감사합니다. –