JAVA

[java.math] BigInteger, BigDecimal

ewok 2023. 3. 9. 17:31

BigInteger 클래스

가장 큰 정수형 타입인 long으로 표현할 수 있는 값은 10진수로 19자리 정도이다. 이보다 더 큰 값을 다룰 때 BigInteger를 사용한다.

 

내부적으로 int 배열을 사용한다.

final int signum;	// 부호
final int[] mag;	// 값

 

생성

BigInteger val;
val = new BigInteger("12345678901234567890");	// 문자열로 생성
val = new BigInteger("FFFF", 16);		// n진수의 문자열로 생성
val = BigInteger.valueOf(1234567890L);		// 숫자로 생성

 

다른 타입으로의 변환

String toString()		// 문자열로 변환
String toString(int radix)	// 지정된 진법의 문자열로 변환
byte[] toByteArray()		// byte배열로 변환

 

Number로부터 상속받은 기본형으로 변환하는 메서드도 있다.

int intValue()
long longValue()
float floatValue()
double doubleValue()

 

정수형으로 변환하는 메서드 중 이름 끝에 'Exact'가 붙은 것들은 변환한 결과가 변환한 타입의 범위에 속하지 않으면 ArithmeticException을 발생시킨다.

byte byteValueExact()
int intValueExact()
long longValueExact()

 

BigInteger의 연산

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

 

비트 연산 메서드

큰 숫자를 다루기 때문에 성능 향상을 위해 비트 연산을 수행하는 메서드가 많다. and, or, xor, not은 물론이고 다른 메서드들도 있다.

int bitCount()			// 2진수로 표현했을 때, 1의개수(음수는 0의 개수)를 반환
int bitLength()			// 2진수로 표현했을 때, 값을 표현하는데 필요한 bit 수
boolean testBit(int n)		// 우측에서 n+1번째 비트가 1이면 true, 0이면 false
BigInteger setBit(int n)	// 우측에서 n+1번째 비트를 1로 변경
BigInteger clearBit(int n)	// 우측에서 n+1번째 비트를 0으로 변경
BigInteger flipBit(int n)	// 우측에서 n+1번째 비트를 전환(1→0, 0→1)

 

정수가 짝수인지

BigInteger bi = new BigInteger("4");
if(bi.remainder(new BigInteger("2")).equals(BigInteger.ZERO) {

위 코드 대신 아래처럼 하는 것이 더 효율적이다.

BigInteger bi = new BigInteger("4");
if(!bi.testBit(0)) {

 

 

 

BigDecimal 클래스

  • 실수형과 달리 정수를 이용해서 실수를 표현한다.
  • 10진 실수를 2진 실수로 정확히 변환할 수 없는 경우가 있기 때문에 실수의 오차가 발생하므로, 오차가 없는 2진 정수로 변환하여 다룬다.
private final BigInteger intVal;	// 정수
private final int scale;		// 지수
private transient int precision;	// 정밀도 - 정수의 자릿수

123.45는 12345 × 10-2로 표현할 수 있다.

이 값이 BigDecimal에 저장되면 intVal은 12345, scale은 2, precision은 5가 된다.

 

생성

BigDecimal val;
val = new BigDecimal("123.4567890");	// 문자열로 생성
val = new BigDecimal(123.456);		// double타입의 리터럴로 생성
val = new BigDecimal(123456);		// int, long타입의 리터럴로 생성가능
val = BigDecimal.valueOf(123.456);	// 생성자 대신 valueOf(double)사용
val = BigDecimal.valueOf(123456);	// 생성자 대신 valueOf(int) 사용

일반적으로 문자열로 숫자를 표현한다.

double타입의 값을 매개변수로 갖는 생성자를 사용하면 오차가 발생할 수 있다.

 

 

다른 타입으로의 변환

String toPlainString()	// 어떤 경우에도 다른 기호없이 숫자로만 표현
String toString()	// 필요하면 지수형태로 표현할 수도 있음

 

BigDecimal도 BigInteger와 같이 기본형으로 변환하는 메서드와 정수형으로 변환하는 메서드 중 이름 끝에 'Exact'가 붙은 메서드가 있다.

 

 

BigDecimal의 연산

BigInteger와 같이 기본적인 연산을 수행하는 메서드가 있다.