int와 같은 정수 자료형은 표현할 수 있는 값의 크기에 한계가 있으며, double과 같은 실수 자료형은 오차 없는 값의 표현이 불가능하다는 문제점이 있다. 이러한 문제점을 해결하기 위해 정의된 BigInteger 클래스와 BigDecimal 클래스에 대해 알아보자.
BigInteger 클래스
- java.math.BigInteger
- 정수 자료형 중 가장 표현 범위가 넓은 long형으로도 표현 불가능한 매우 큰 정수를 표현하기 위한 클래스이다.
- long형 범위를 넘을 경우는 잘 없겠지만, 정수 표현 범위를 넘어서게 되면 내가 의도하지 않은 결과가 나올 수 있기 때문에
거의 무한에 가까운 수를 표현해야할 가능성이 있다면 BigInteger 클래스를 사용할 수 있다. - BigInteger 클래스는 문자열 형태로 숫자를 처리하기 때문에 아무리 큰 수라도 담을 수 있다.
선언 방법
import java.math.BigInteger
BigInteger bigNumber = new BigInteger("100000001")
메서드
연산 메서드
덧셈 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의 값을 정수형으로 반환하는 메서드
BigInteger 인스턴스에 저장된 값을 long형 정수로 반환 public long longValueExact()
BigInteger 인스턴스에 저장된 값을 int형 정수로 반환 public int intValueExact()
만약 BigInteger 인스턴스에 저장된 값이 long형 또는 int형 정수로 표현이 불가능한 상황에서 위 메소드를 호출할 경우 ArithmeticException 예외가 발생한다.
public class BigIntegerClass {
public static void main(String[] args) {
// long형으로 표현 가능한 값의 크기 출력
System.out.println("최대 정수: " + Long.MAX_VALUE);
System.out.println("최소 정수: " + Long.MIN_VALUE);
System.out.println();
// 정수로 표현할 수 없는 매우 큰 수를 BigInteger 인스턴스를 생성해 표현
BigInteger big1 = new BigInteger("100000000000000000000000000000");
BigInteger big2 = new BigInteger("-99999999999999999999999999999");
// BigInteger 기반의 덧셈 연산
BigInteger r1 = big1.add(big2);
System.out.println("덧셈 결과: " + r1);
// BigInteger 기반의 곱셈 연산
BigInteger r2 = big1.multiply(r1);
System.out.println("곱셈 결과: " + r2);
System.out.println();
// BigInteger 인스턴스에 저장된 값을 int형 정수로 반환
int num = r1.intValueExact();
System.out.println("to int From Biginteger: " + num);
}
}
// 실행 결과
최대 정수: 9223372036854775807
최소 정수: -9223372036854775808
덧셈 결과: 1
곱셈 결과: 100000000000000000000000000000
From Biginteger: 1
BigDecimal 클래스
- java.math.BigDecimal
- 오차 없는 실수의 표현을 위한 클래스이다.
메서드
덧셈 public BigDecimal add(BigDecimal augend)
뺄셈 public BigDecimal subtract(BigDecimal subtrahend)
곱셈 public BigDecimal multiply(BigDecimal multiplicand)
나눗셈 public BigDecimal divide(BigDecimal divisor)
public class BigDecimalClass {
public static void main(String[] args) {
BigDecimal d = new BigDecimal(1.6); // 가능은 하지만 실수 표현에 오차가 발생
System.out.println("오차가 있는 1.6 : " + d);
BigDecimal d1 = new BigDecimal("1.6"); // 오차를 발생시키지 않기 위해 문자열 형태로 인스턴스 생성
BigDecimal d2 = new BigDecimal("0.1"); // 오차를 발생시키지 않기 위해 문자열 형태로 인스턴스 생성
System.out.println("덧셈 결과 : " + d1.add(d2));
System.out.println("곱셈 결과 : " + d1.multiply(d2));
}
}
// 실행 결과
오차가 있는 1.6 : 1.600000000000000088817841970012523233890533447265625
덧셈 결과 : 1.7
곱셈 결과 : 0.16
Reference
'☕ Java > 이론' 카테고리의 다른 글
[Java] Map 컬렉션 클래스 (0) | 2022.01.25 |
---|---|
[Java] 컬렉션 프레임워크 (0) | 2022.01.18 |
[Java] 제네릭3 (와일드 카드) (0) | 2022.01.17 |
[Java] 제네릭2 (상속, 제네릭 인터페이스) (0) | 2022.01.14 |
[Java] 제네릭1 (제네릭 클래스, 제네릭 메소드) (0) | 2022.01.13 |
[Java] Arrays 클래스 (0) | 2022.01.12 |
[Java] 기본 클래스 (Math, Random, StringTokenizer) (0) | 2022.01.12 |
[Java] Wrapper, Number 클래스 (0) | 2022.01.11 |