답변:
로부터 자바 (11) BigDecimal
워드 프로세서 :
때
MathContext
개체 10-0의 정밀도가 설정된 공급 (예MathContext.UNLIMITED
), 연산은 더 취하지 연산 방법이며, 정확한있는MathContext
개체. (이것은 5 이전 릴리스에서 지원 된 유일한 동작입니다.)정확한 결과를 계산 한 결과,
MathContext
정밀도 설정이 0 인 객체 의 반올림 모드 설정은 사용되지 않으므로 관련이 없습니다. 나누기의 경우 정확한 몫은 무한 길이의 십진수 확장을 가질 수 있습니다. 예를 들어 1을 3으로 나눈 값입니다.몫에 끝나지 않는 10 진수 확장이 있고 정확한 결과를 반환하도록 연산이 지정된 경우
ArithmeticException
가 발생합니다. 그렇지 않으면 다른 작업에서와 같이 정확한 분할 결과가 반환됩니다.
수정하려면 다음과 같이해야합니다 .
a.divide(b, 2, RoundingMode.HALF_UP)
여기서 2는 스케일이고 RoundingMode.HALF_UP은 반올림 모드입니다.
자세한 내용은 이 블로그 게시물을 참조하십시오 .
넌 할 수있어
a.divide(b, MathContext.DECIMAL128)
32,64,128 중에서 원하는 비트 수를 선택할 수 있습니다.
이 링크를 확인하십시오 :
이러한 문제를 해결하기 위해 아래 코드를 사용했습니다.
a.divide(b, 2, RoundingMode.HALF_EVEN)
2는 정밀도입니다. 이제 문제가 해결되었습니다.
내 코드 줄이 다음과 같기 때문에 동일한 문제가 발생했습니다.
txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");
십진수 정밀도를 쓰지 않았기 때문에 이전 답변을 읽는 것으로 변경합니다.
txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");
4는 10 진법
AND RoundingMode는 Enum 상수이며,이 중 하나를 선택할 수 있습니다
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
이 경우 HALF_UP의 결과는 다음과 같습니다.
2.4 = 2
2.5 = 3
2.7 = 3
RoundingMode
여기 에서 정보 를 확인할 수 있습니다 : http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/
BigDecimal에 대한 답변에서 ArithmeticException이 발생 함
public static void main(String[] args) {
int age = 30;
BigDecimal retireMentFund = new BigDecimal("10000.00");
retireMentFund.setScale(2,BigDecimal.ROUND_HALF_UP);
BigDecimal yearsInRetirement = new BigDecimal("20.00");
String name = " Dennis";
for ( int i = age; i <=65; i++){
recalculate(retireMentFund,new BigDecimal("0.10"));
}
BigDecimal monthlyPension = retireMentFund.divide(
yearsInRetirement.divide(new BigDecimal("12"), new MathContext(2, RoundingMode.CEILING)), new MathContext(2, RoundingMode.CEILING));
System.out.println(name+ " will have £" + monthlyPension +" per month for retirement");
}
public static void recalculate (BigDecimal fundAmount, BigDecimal rate){
fundAmount.multiply(rate.add(new BigDecimal("1.00")));
}
나누기 메소드 호출에 MathContext 객체를 추가하고 정밀도 및 반올림 모드를 조정하십시오. 문제를 해결해야합니다
프로그램은 십진수의 정밀도를 알지 못하므로 다음을 throw합니다.
java.lang.ArithmeticException: Non-terminating decimal expansion
MathContext precision = new MathContext(int setPrecisionYouWant); // example 2
BigDecimal a = new BigDecimal("1.6",precision);
BigDecimal b = new BigDecimal("9.2",precision);
a.divide(b) // result = 0.17