java에서 더블 형식 연산 결과 이상 해결 방법
두 개의 더블 형식의 값을 연산하면 때때로 결과 값이 이상하는 문제가 발생할 수 있다.예:
System.out.println(19.99+20);
System.out.println(1.0-0.66);
System.out.println(0.033*100);
System.out.println(12.3/100);
출력:39.989999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001
해결 방법:
Java의 간단한 부동소수점 형식인 플로트와 더블은 연산을 할 수 없습니다. 대부분의 경우 정상적이지만 간혹 위와 같은 문제가 발생할 수 있습니다.이 문제는 사실 JAVA의 버그가 아니다. 컴퓨터 자체가 2진법이고 부동점수는 사실상 근사값이기 때문에 2진법에서 10진법 부동점수로 바뀔 때 정밀도를 잃어버리기 쉬워 정밀도가 떨어진다.
정밀도를 확보하려면 Big Decimal 클래스를 사용해야 하며, Double에서 Big Decimal을 직접 바꿀 수 없으며, Double를 string에서 Big Decimal로 돌려야 한다.즉, Big Decimal(double val) 방법을 사용할 수 없으면 효과가 없다는 것을 발견할 수 있다.BigDecimal(String val) 메서드를 사용합니다.구체적인 예는 아래와 같다.
더블 형식 네 가지 연산 예:
1. 더하기
public static double add(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.add(b2).doubleValue();
}
2、상감
public static double sub(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.subtract(b2).doubleValue();
}
3. 곱하기
public static double mul(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.multiply(b2).doubleValue();
}
4. 서로 제외
public static double div(double a1, double b1, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("error");
}
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
scale 매개 변수가 다 제거되지 않을 때 정밀도를 지정합니다.이상의 이java에서 더블 형식 연산 결과가 이상한 해결 방법은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.