MathicalException: "비단수 소수점 확장, 정확한 표현 가능한 소수점 결과 없음"
다음 코드가 아래에 표시된 예외를 제기하는 이유는?
BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.
예외:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
~할 때
MathContext
객체는 0(예: )의 정밀 설정으로 제공되며, 산술 연산은 정확하며, 산술 연산은 no를 필요로 하는 산술 방법과 같다.MathContext
이의를 제기하다(5 이전 릴리스에서 지원되는 유일한 동작)정확한 결과를 계산하는 데 있어 유의한 반올림 모드 설정
MathContext
정밀 설정이 0인 물체는 사용되지 않으므로 무관하다.분할의 경우 정확한 지수는 무한히 긴 소수점 확장을 가질 수 있다. 예를 들어, 1을 3으로 나눈 값이다.인용 부위가 일정하지 않은 소수점 확장성을 가지며 정확한 결과를 반환하도록 연산을 지정한 경우
ArithmeticException
던져지다그렇지 않으면 다른 작전에 대해 그랬던 것처럼 정확한 분할 결과가 반환된다.
고치기 위해서는 다음과 같은 일을 해야 한다.
a.divide(b, 2, RoundingMode.HALF_UP)
여기서 2는 스케일 및 라운딩 모드.HEFT_UP가 반올림 모드임
자세한 내용은 이 블로그 게시물을 참조하십시오.
왜냐하면 당신은 정밀도와 반올림 모드를 지정하지 않고 있기 때문이다.BigDecimal은 10, 20, 5000 또는 무한 소수점을 사용할 수 있다고 불평하고 있으며, 여전히 그 숫자를 정확하게 표현할 수 없을 것이다.그래서 당신에게 잘못된 BigDecimal을 주는 대신, 그것은 단지 당신을 칭얼거릴 뿐이다.
그러나 라운딩 모드와 정밀도를 제공하면 변환이 가능하지만(예: 1.333333-인피니티에서 1.3333-인피니티로 변환 가능하지만 프로그래머로서 자신이 '행복한' 정밀도를 알려야 한다.
할수있습니다
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는 십진법이다.
이 AND RoundingMode 중 할 수 .UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
이 경우 HEFT_UP는 다음과 같은 결과를 갖는다.
2.4 = 2
2.5 = 3
2.7 = 3
당신은 그것을 확인할 수 있다.RoundingMode
여기 정보: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/
그것은 결과를 반올림하는 문제인데, 나에게 해결책은 다음과 같다.
divider.divide(dividend,RoundingMode.HALF_UP);
BigDecimal 던지기에 대한 답변 산술 Exception
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 개체를 추가하고 정밀도와 반올림 모드를 조정하십시오.이것으로 너의 문제가 해결될 것이다.
프로그램에서는 소수 자릿수를 사용할 정밀도를 모르므로 다음을 수행하십시오.
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
나에겐, 이것과 함께 작용하고 있다:
BigDecimal a = new BigDecimal("9999999999.6666",precision);
BigDecimal b = new BigDecimal("21",precision);
a.divideToIntegralValue(b).setScale(2)
'Programing' 카테고리의 다른 글
Java의 foreach 루프에서 remove 호출 (0) | 2022.04.25 |
---|---|
Mac에 Java 8을 설치하는 방법 (0) | 2022.04.25 |
어떤 구성 요소가 어떤 작업을 Vuex라고 부르는지 알 수 있는가? (0) | 2022.04.25 |
Vue js 2 - 하위 구성 요소에서 App.vue의 데이터 액세스 (0) | 2022.04.25 |
Maven: 아티팩트 설명자를 읽지 못함 (0) | 2022.04.24 |