본문 바로가기

Java

Java- BigInteger, BigDecimal 클래스

매우 큰 정수를 표현하는 BigInteger 클래스

  기존 정수를 표현함에 있어서 int와 long의 경우  그 크기에 한계가 있어 제약이 존재했다. 이를 해결하기 위한 클래스가 BigInteger 클래스이다. 얘는 따로 사이즈의 제약이 없다. 기본적으로 int, long과 같은 기본 자료형으로 표현되는 것이 아닌 문자열로 표현되기에 이러한 제약에서 벗어날 수 있다.

 

 생성

BigInteger big = new BigInteger("1000000000000000000000000000000000000000000000000000000000");

 위와 같이 일반적인 클래스 인스턴스 생성하듯이 생성한다. 특이한 점이라면 내부 값이 문자열의 형태로 되어있고 그 수의 사이즈가 일반적인 자료형으로는 표현할 수 없을 정도로 큰 수도 표현이 가능하다.

 

 BigInteger 기반 메소드

  • public BigInteger add (BigInteger val)                                     덧셈
  • public BigInteger subtract (BigInteger val)                              뺄셈
  • public BigInteger multiply (BigInteger val)                              곱셈
  • public BigInteger divide (BigInteger val)                                  나눗셈
  • public BigInteger remainder (BigInteger val)                           나머지

사실 위 메소드들

BigInteger big1 = new BigInteger("1000000000000000");
BigInteger big2 = new BigInteger("5000000000000000");

BigInteger r1 = big1.add(big2);        //6000000000000000
BigInteger r2 = big1.subtract(big2);   //-4000000000000000
BigInteger r3 = big1.multiply(big2);   //5000000000000000000000000000000
BigInteger r4 = big1.divide(big2);     //0
BigInteger r5 = big1.remainder(big2);  //1000000000000000

의 사용은 그 함수명 만큼이나 쉽고 직관적이다.

 

  BigInteger를 int, long으로 변환하는 메소드

  그리고 다음 아래의 두 함수는 BigInteger 인스턴스의 값이 int나 long으로 표현이 가능한 범위인 경우 int, long 형으로 변환해준다. 그리고 이 때 사이즈가 너무커서 변환이 불가능한 경우 "ArithmeticException" 예외가 발생한다.

  • public int intValueExact()                        BigInteger 인스턴스에 저장된 값을 int형 정수로 변환
  • public long longValueExact()                   BigInteger 인스턴스에 저장된 값을 long형 정수로 변환
BigInteger big1 = new BigInteger("123123123123123");
BigInteger big2 = new BigInteger("123123123123122");

int num = (big1.subtract(big2)).intValueExact();  //1

 

정확한 값을 계산하는 BigDecimal 클래스

 

System.out.println(1.6 * 0.1);
//0.16000000000000003

 단순히 실수로 계산을 하게되면 위 처럼 오차가 발생하는 경우가 있다.

 

 이럴때 정확한 값을 표현하기 위해서 BigDecimal 클래스를 사용한다. 사용법은 BigInteger와 매우 유사하다.

 

import java.math.BigDecimal;

public class BigDecimalControl {
    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("1.6");
        BigDecimal b2 = new BigDecimal("0.1");

        System.out.println(b1.add(b2));  //1.7
        System.out.println(b1.multiply(b2));  //0.16
        System.out.println(b1.subtract(b2));  //1.5
        System.out.println(b1.divide(b2));  //16
        System.out.println(b1.remainder(b2));  //0.0
    }
}

'Java' 카테고리의 다른 글

Java- Arrays 클래스  (0) 2023.01.06
Java- Random 클래스, 난수 생성  (0) 2023.01.06
Java- 래퍼 클래스  (0) 2023.01.03
Java- Object 클래스  (0) 2023.01.02
Java- 예외처리  (0) 2023.01.02