ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] BigInteger & BigDecimal 클래스
    Java/개념 정리 2020. 2. 28. 16:20

    BigInteger & BigDecimal 클래스를 사용하는 이유

     우리가 흔히 사용하는 int, short와 같은 정수 자료형은 매우 큰 수의 표현이 불가능합니다. 그리고 float, double 같은 경우에는 실수 자료형이고 매우 정밀한 수의 표현에 제약이 있기에 오차가 발생합니다. 이러한 문제점을 해결하기 위해 사용되는 것이 BigInteger & BigDecimal 클래스입니다. 클래스들은 java.math 패키지에 묶여 있기때문에 import를 해주어야합니다. 

     

    BigInteger 클래스

     일반적으로 우리가 사용하는 정수의 표현에 있어서 기본자료형인 int형을 사용하면 원하는 수의 표현이 가능합니다. 그러나 기본자료형으로 표현이 불가능한 정수를 표현해야하는 상황이 발생하면 우리는 Java에서 제공하는 BigInteger 클래스를 사용합니다. 사용방법은 아래의 코드와 같습니다.

    class BigInt {
    	public static void main ( String[] args ) {
        	BigInteger num1 = new BigInteger("100000000000000000000");
            BigInteger num2 = new BigInteger("-99999999999999999999");
            
            BigInteger mul = num1.multiply(num2);
        	System.out.println(mul); // -9999999999999999999900000000000000000000 를 출력한다.
        }
    }

    위의 코드를 확인해보면 어느정도 이해가 되겠지만 의문점이 하나 있습니다. 왜 인스턴스를 생성할 때 문자열형태로 전달하는 것일까? 일단은 정수를 전달받을 수 있는 생성자가 존재하지 않습니다. 그리고 좀 더 정확한 이유로는 위와 같이 큰 수를 전달받을 수 있는 매개변수 선언이 불가능하기 때문입니다. 그렇기에 생성자도 존재하지 않는 것입니다. 

     

    BigDecimal 클래스

     BigDecimal 클래스는 오차가 존재하지 않는 실수의 표현을 위해 사용되는 클래스입니다. 일반적으로 우리가 알고있는 double형의 데이터 표현에는 오차가 존재합니다. 아래의 코드를 통해 double형의 데이터 표현에서의 오차를 확인할 수 있습니다. 

    public ErrorDouble {
    	public static void main ( String[] args ) {
        		double num1 = 1.2;
            	double num2 = 0.1;
            	System.out.println((num1+num2)); // 1.3000000000000002 출력
            	System.out.println((num1*num2)); // 0.12000000000000003 출력
        	}
    }

    위와 같은 오차의 발생을 막기위해 오차 없는 실수의 표현 및 연산에는 BigDecimal 클래스를 사용합니다. 

    public DoubleBigDecimal {
    	public static void main ( String[] args ) {
        		BigDecimal num1 = new BigDecimal("1.2");
            	BigDecimal num2 = new BigDecimal("0.1");
            	System.out.println((num1.add(num2))); // 1.3 출력
            	System.out.println((num1.multiply(num2))); // 0.12 출력
        	}
    }

    BigDecimal 클래스를 사용해 오차 없는 실수의 표현 및 연산이 가능함을 확인할 수 있습니다. 주의할 점은 BigInteger와 마찬가지로 인스턴스를 생성할 때 문자열 형태로 전달해야 한다는 점입니다. 

     

     

    댓글

Camel`s Tistory.