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
이
사람이 왜 알고 있나요 :
이 내가 해봤 무엇인가?
매우 작은 값이지만, 염두에 두어야 할 것이 있습니다. BigDecimal.ONE과 BigDecimal.TEN은 상수로 존재합니다. 10을 곱하기보다는 scaleByPowerOfTen ([javadoc] (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#scaleByPowerOfTen (int)))을 유용하게 사용할 수 있습니다. . 그래도 문제는 당신과 관련이 없습니다. –
1/11을 나타내는 값을 곱하는 대신 항목 가격을 11로 나누면 더 정확한 결과를 얻을 수 있습니다. 이는 컴퓨터가 전체 반복 소수를 저장할 수있는 메모리가 충분하지 않기 때문에 'BigDecimal'이 정확히 1/11 (.090909090 ...)을 나타낼 수 없기 때문입니다. :) 궁극적으로 항목 가격이 충분히 크면 반올림 오류가 발생합니다. – ajb
감사합니다. 예, 가격을 11로 나눌 코드를 수정합니다. 좋은 아이디어입니다. 마이클 - "10"은 계산과 관련이 없으며 단지 임의적입니다. 단지 샘플 일뿐입니다. 건배. –