개발자의 길

[java]Java.math.BigDecimal의 사용(double,float 더하기 버그해결) 본문

4. JAVA

[java]Java.math.BigDecimal의 사용(double,float 더하기 버그해결)

자르르 2014. 2. 13. 14:27


Java.math.BigDecimal의 사용

실수 연산의 경우 float , double 타입의 사용에 주의해야 한다.

System.out.println(2.0 - 1.1); 를 해보면 그 이유를 알 수 있다.  이에 대한 결과는 0.9가 아니라 0.8999999999  결과가 출력 된다.  이는 컴퓨터가 숫자1.1을 double로 정확하게 표현 할 수 없어 근사치를 출력하기 때문이다.  이에 대한 해결책으로 정확한 소수 연산을 수행하는BigDecimal 타입이 있다.  단, 주의할 점은 항상 BigDecimal(double)이 아닌 BigDecimal(String) 생성자를 사용해야 한다.   이유는BigDecimal(double)을 사용하는 순간, double 자체가 정확하게 수를 표현 못하기 때문에 생성 자체부터 부정확한 값이 기억되기 때문이다.

예 1) 

import java.math.*;

~

BigDecimal s1 = new BigDecimal("2.0");

BigDecimal s2 = new BigDecimal("1.1");

out.println(s1.subtract(s2)); 

 

 

 

BigDecimal타입의 사칙연산

매우 큰 숫자형의 연산은 BigDecimal 형으로 변경 후 계산을 하면 효과적이다.

예 2)

import! java.math.*;

public class Test {

 public static void main(String[] args) {
  
            BigDecimal su1 = new BigDecimal("12345678901234567899");
  
            BigDecimal su2 = new BigDecimal("12345678901234567890");
              BigDecimal p_add = su1.add(su2);   // 더하기  

BigDecimal p_sub = su1.subtract(su2);   // 빼기  

BigDecimal p_mul = su1.multiply(su2);   // 곱하기  

BigDecimal p_div1 = su1.divide(su2, BigDecimal.ROUND_UP);   // 나누기 - 무조건 반올림  

BigDecimal p_div2 = su1.divide(su2, 4, BigDecimal.ROUND_UP);  // 나누기 - 소수점 4번째 자리에서 반올림.
              System.out.println("덧셈 : " + p_add);

System.out.println("뺄셈 : " + p_sub);

System.out.println("곱셈 : " + p_mul);

System.out.println("나눗셈1 : " + p_div1);

System.out.println("나눗셈2 : " + p_div2);

 }

}



이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments