java에서 더블 형식 연산 결과 이상 해결 방법

2106 단어 javadouble연산
질문:
두 개의 더블 형식의 값을 연산하면 때때로 결과 값이 이상하는 문제가 발생할 수 있다.예:

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에서 더블 형식 연산 결과가 이상한 해결 방법은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기