문제:
두 개의 double 유형 값을 연산할 때 결과 값이 비정상적인 경우가 있습니다. 예:
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.9899999999999995
0.33999999999999997
3.300000000000003
0.12 3 00000000000001
해결책:
Java에서 간단한 부동 소수점 유형인 float 및 double은 작동할 수 없습니다. 이는 대부분의 경우 정상이기 때문입니다. 그러나 때때로 위에 표시된 문제가 발생할 수 있습니다. 이 문제는 실제로 JAVA 버그가 아닙니다. 컴퓨터 자체가 이진수이고 부동 소수점 숫자는 실제로 근사치일 뿐이므로 이진수에서 십진수 부동 소수점 숫자로 변환할 때 정확도가 쉽게 떨어지며 결과적으로 정확도가 떨어집니다.
정확성을 보장하려면 BigDecimal 클래스를 사용해야 하며 double을 BigDecimal로 직접 변환한 다음 BigDecimal로 변환해야 합니다. 즉, BigDecimal(double val) 메소드를 사용할 수 없으며 아무런 효과가 없음을 알 수 있습니다. BigDecimal(String val) 메소드를 사용합니다. 구체적인 예는 다음과 같습니다.
더블 유형의 4가지 산술 연산 예:
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.
3. 곱셈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(); }
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(); }