티스토리 뷰

long 자료형

보통 정수는 기본 자료형인 int를 많이 사용한다. 하지만 int의 표현 범위를 넘는 값을 변수에 담아서 사용한다면 long형을 사용해야 한다.

 

  int long
저장공간 4byte 8byte
범위 -2147483648
~ 2147483647
 -9223372036854775808
~ 9223372036854775807

 

 

 

BigInteger 클래스

long형을 넘는 더 큰 범위의 정수를 다룰 때 사용하는 클래스로 java.math에 속한다. int, long과 같은 자료형처럼 사칙연산(+,-,*,/,%)을 기호로 할 수 없고, BigInteger에서 제공하는 메서드를 이용해야 한다.

 

생성 방법

// 문자열로 생성
BigInteger bigInteger = new BigInteger("123456");

//n진수 문자열로 생성
BigInteger bigInteger = new BigInteger("FFFF", 16);

//valueOf 생성
BigInteger bigInteger = BigInteger.valueOf(123456);

여러 가지 방법이 있지만 보통 일반 정수형으로 다룰 수 없는 큰 수를 다루기 때문에 문자열로 생성한다.

 

연산

기호로 직접 연산할 수 없기 때문에 add(), substract(), multiply(), divide(), mod() 메서드를 사용한다.

BigInteger bigNum = new BigInteger("3");
System.out.println("3+3="+bigNum.add(BigInteger.valueOf(3)));
System.out.println("3-3="+bigNum.subtract(BigInteger.valueOf(3)));
System.out.println("3*3="+bigNum.multiply(BigInteger.valueOf(3)));
System.out.println("3/3="+bigNum.divide(BigInteger.valueOf(3)));
System.out.println("3%3="+bigNum.mod(BigInteger.valueOf(3)));

결과값

비교

compareTo()를 사용하여 비교할 수 있다. 같으면 0, 앞 숫자가 더 크면 1, 뒷 숫자가 더 크면 -1을 반환한다.

System.out.println(BigInteger.valueOf(3).compareTo(BigInteger.valueOf(3)));//0
System.out.println(BigInteger.valueOf(3).compareTo(BigInteger.ONE));//1
System.out.println(BigInteger.ONE.compareTo(BigInteger.valueOf(3)));//-1

참고로 0,1,2,10은 BigInteger.ZERO, BigInteger.ONE, BigInteger.TWO, BigInteger.TEN으로 클래스에서 제공한다.

 

 

정렬

String []s= {"3","4","8","6","1","2"};

//Arrays.sort()를 이용 BigInteger의 compareTo를 이용한다
Arrays.sort(s, 0, 6, (s1, s2)->(new BigInteger(s2).compareTo(new BigInteger(s1))));//내림차순
for(int i=0;i<6;i++) {
	System.out.print(s[i]+" ");
}
System.out.println();
Arrays.sort(s, 0, 6, (s1, s2)->(new BigInteger(s1).compareTo(new BigInteger(s2))));//오름차순
for(int i=0;i<6;i++) {
	System.out.print(s[i]+" ");
}

결과값

변환

BigInteger bigNumber = BigInteger.valueOf(12345); 
System.out.println(bigNumber.intValue());//BigIntger -> int
System.out.println(bigNumber.longValue());//BigIntger -> long
System.out.println(bigNumber.floatValue());//BigIntger -> float
System.out.println(bigNumber.doubleValue());//BigIntger -> double
System.out.println(bigNumber.toString());//BigIntger -> String

결과값

 

 

 

BigDecimal 클래스

기본적으로 위의 BigInteger 클래스와 비슷하지만 차이점은 BigInteger은 정수 , BigDecimal은 실수를 다룬다는 점이다.

double, float 등은 정밀도에 한계가 있어 원하는 값이 나오지 않을 수 있다. 이럴 때 BigDecimal을 이용해 해결한다.

 

* 왜 double, float은 오차가 발생할까?

double 타입이 내부적으로 수를 저장할 때 이진수의 근사치를 저장하기 때문이다. 저장된 근사치 값을 다시 십진수로 변환하면서 오차가 발생한다. 반면에 BigDecimal 타입은 내부적으로 수를 십진수로 저장하여 아주 작은 수과 큰 수의 연산에 대해 거의 무한한 정밀도를 보장한다.

 

 

생성 방법

// 문자열로 생성
BigDecimal bigDecimal = new BigDecimal("123.456");

//double 타입으로 생성-오차발생 가능성
BigDecimal bigDecimal = new BigDecimal(123.456);

//int, long 타입으로 생성
BigDecimal bigDecimal = new BigDecimal(123456);

//valueOf 생성
BigDecimal bigDecimal = BigDecimal.valueOf(123456);

BigInteger와 다른 점은 double, int, long타입으로도 생성이 가능하다는 점인데, double의 정밀도의 한계가 있어 사용하는 클래스 이므로 double타입으로 생성할 경우 오차 발생 가능성이 존재한다. BigDecimal 역시 BigInteger처럼 보통 문자열로 생성한다.

 

 

소수점 처리

// 소수점 이하 버림
// 1
new BigDecimal("1.1234567890").setScale(0, RoundingMode.FLOOR);

// 소수점 이하를 버리고 1증가 -> 올림
// 2
new BigDecimal("1.1234567890").setScale(0, RoundingMode.CEILING);
// 음수에서는 소수점 이하만 버림
// -1
new BigDecimal("-1.1234567890").setScale(0, RoundingMode.CEILING);

// 소수점 자리수에서 오른쪽의 0 부분을 제거한 값을 반환한다.
// 0.9999
new BigDecimal("0.99990").stripTrailingZeros();

// 소수점 자리수를 재정의한다.
// 원래 소수점 자리수보다 작은 자리수의 소수점을 설정하면 예외가 발생한다.
// java.lang.ArithmeticException: Rounding necessary
new BigDecimal("0.1234").setScale(3);

// 반올림 정책을 명시하면 예외가 발생하지 않는다.
// 0.123
new BigDecimal("0.1234").setScale(3, RoundingMode.HALF_EVEN);

// 소수점을 남기지 않고 반올림한다.
// 0
new BigDecimal("0.1234").setScale(0, RoundingMode.HALF_EVEN);
// 1
new BigDecimal("0.9876").setScale(0, RoundingMode.HALF_EVEN);

 

 

나눗셈 처리- java.lang.ArithmeticException

BigDecimal b10 = new BigDecimal("10");
BigDecimal b3 = new BigDecimal("3");

// 나누기 결과가 무한으로 떨어지면 예외 발생
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
b10.divide(b3);

// 반올림 정책을 명시하면 예외가 발생하지 않음
// 3
b10.divide(b3, RoundingMode.HALF_EVEN);

// 반올림 자리값을 명시
// 3.333333
b10.divide(b3, 6, RoundingMode.HALF_EVEN);

// 3.333333333
b10.divide(b3, 9, RoundingMode.HALF_EVEN);

// 전체 자리수를 7개로 제한하고 HALF_EVEN 반올림을 적용한다.
// 3.333333
b10.divide(b3, MathContext.DECIMAL32);

// 전체 자리수를 16개로 제한하고 HALF_EVEN 반올림을 적용한다.
// 3.333333333333333
b10.divide(b3, MathContext.DECIMAL64);

// 전체 자리수를 34개로 제한하고 HALF_EVEN 반올림을 적용한다.
// 3.333333333333333333333333333333333
b10.divide(b3, MathContext.DECIMAL128);

// 전체 자리수를 제한하지 않는다.
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 예외가 발생한다.
b10.divide(b3, MathContext.UNLIMITED);

 

 

 

 

참고 링크

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함