Java - BigInteger,BigDecimal

2020. 6. 30. 23:05Java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.math.BigDecimal;
import java.math.BigInteger;
 
public class Ex2 {
 
    public static void main(String[] args) {
        
        
        /*
         * BigInteger & BigDecimal 클래스
         * java.math 패키지
         * 정수형을 확장시켜주는 BigInteger 클래스
         * ->자릿수 부족으로 인한 문제 해결
         * 실수형을 확장시켜주는 BigDecimal 클래스
         * ->자릿수 부족 또는 연산에서의 부정확성 문제를 해결
         * 내부적으로 배열을 사용하여 수치데이터를 분리해서 저장하므로
         * 수치데이터 자릿수에 제한이 없다(정수=int[], 실수=char[])
         * 생성자에 문자열 형태의 수치데이터를 전달하여 데이터 생성
         * 사칙연산 등의 모든 연산은 메서드를 호출하여 수행
         * 
         * 
         */
        //long l=112465498987216843243546541574248541213254654874545L;//Long 타입 범위 초과하는 정수 사용불가
        
        
        //BigInteger 객체를 생성하면 long 타입 범위를 넘어서는 아주 큰 정수 처리도 가능
        BigInteger bi= new BigInteger("112465498987216843243546541574248541213254654874545");
        System.out.println("BigIngteger 정수 : "+bi);//toString() 메서드 오버라이딩 되어있음
        
        BigInteger bi2=new BigInteger("-99999999");
        //기본 사칙연산 : 각 메서드를 호출하여 BigInteger 타입 파라미터를 피연산자로 사용
        System.out.println(bi.add(bi2));
        System.out.println(bi.subtract(bi2));
        System.out.println(bi.multiply(bi2));
        System.out.println(bi.divide(bi2));
        
        
        //나머지 연산의 경우 2가지 메서드로 나누어지며
        //둘다 나눗셈 결과의 나머지를 리턴하지만
        //mod() 메서드의 경우 결과값이 음수일때 ArithmeticException 예외를 발생시킴
        
        System.out.println(bi.remainder(bi2));
        
        
        try {
            System.out.println(bi.mod(bi2));
        } catch (Exception e) {
            System.out.println("나눗셈 결과의 나머지 값이 음수입니다!");
        }
        
        System.out.println("------------------------------------------------");
        
        //실수 연산 과정에서 유효자릿수에 대한 표현 문제로
        //연산 결과가 올바른 값이 아닐수 있다. 특히 .1 에 대한 문제가 주로 발생
        
        double d1=2.0;
        double d2=1.1;
        System.out.println(d1-d2);
        
        //따라서 실수끼리의 연산은 BigDecimal 클래스를 사용하는 것이 안전하다.
        //기본 데이터타입 중 정수형으로 변환 후 처리도 가능하지만, 자릿수 문제 발생
        
        BigDecimal bd1=new BigDecimal("2.0");
        //주의!@ 반드시 생성자에 문자열 타입으로 실수데이터를 전달해야 문제가 없다.
        BigDecimal bd2=new BigDecimal("1.1");
        
        System.out.println(bd1.subtract(bd2));
        
 
 
    }
 
}
cs

BigInteger와 BigDecimal 은 정수형 타입과 실수형 타입을 사용할 때 자릿수 부족을 확장시켜주는 역할을 하는 클래스 들이다. 특히 실수형 같은 경우엔 0.1 단위 차이로 문제가 자주 발생하는데 BigDecimal을 사용하면 그런 문제를 해결해준다.

다만, BigDecimal 을  사용할 때 값은 "" 문자열 타입으로 입력을 해주어야 한다.

'Java' 카테고리의 다른 글

Java - Stack & Queue  (0) 2020.06.30
Java - Collection 프레임워크의 Map  (0) 2020.06.30
Java - StringBuilder & StringBuffer  (0) 2020.06.30
Java - Wrapper  (0) 2020.06.30
Java - DAO,DTO활용  (0) 2020.06.29