본문 바로가기
Java & Spring

Java 큰 수의 표현 BigInteger 와 BigDecimal

by softserve 2021. 11. 1.
반응형

정수

int나 long과 같은 데이터타입의 범위(대략 9,223,372,036,854,775,807) 를 넘는 숫자는

각 숫자를 BigInteger class의 객체로 나타낼 수 있습니다.

import java.Math.BigInteger;

BigInteger b1 = new BigInteger("12345678901234567890");
BigInteger b2 = new BigInteger("1");

System.out.println(b1.compareTo(b2)); // b1>b2면 1, 같으면 0, b1<b2 면 -1 반환

System.out.println(b1.add(b2)); // (+)
System.out.println(b1.subtract(b2)); // (-)
System.out.println(b1.multiply(b2)); // (*)
System.out.println(b1.divide(b2)); // (/)
System.out.println(b1.remainder(b2)); // (%)
    
System.out.println(b1+"은 (int)"+b1.intValue()+"입니다."); // int형으로 변환

 

1234567890123412341234567891
1234567890123412341234567889
1234567890123412341234567890
1234567890123412341234567890
0
1234567890123412341234567890은 (int)-264795438입니다.

 

실수

float 또는 double 형은 해당 숫자의 근사치를 저장하기 때문에 보다 정확한 표현을 위해서는 BigDecimal 클래스를 이용할 필요가 있습니다.

import java.math.BigDecimal;

class Main {
    public static void main(String[] args) {
    
    	BigDecimal bd1 = new BigDecimal("0.01");
    	BigDecimal bd2 = new BigDecimal(0.01);
    	BigDecimal bd3 = BigDecimal.valueOf(0);
    	BigDecimal bd4 = BigDecimal.valueOf(0.01);
    	
    	if(!bd1.equals(bd2)) System.out.println(bd1+"!="+bd2);
    	if(!bd2.equals(bd4)) System.out.println(bd2+"!="+bd4);
    	if(bd1.compareTo(bd2)==1) System.out.println(bd1.subtract(bd2));
    	
    	if(bd3 == BigDecimal.ZERO) System.out.println("bd3은" + BigDecimal.ZERO.intValue());
    	else if(bd3 == BigDecimal.ONE) System.out.println("bd3은" + BigDecimal.ZERO.intValue());
    	
    	System.out.println(bd1.multiply(BigDecimal.TEN).doubleValue());
    }
}
0.01!=0.01000000000000000020816681711721685132943093776702880859375
0.01000000000000000020816681711721685132943093776702880859375!=0.01
bd3은0
0.1

생성자로 객체를 생성할 때에는 문자열을 인자로 넣거나 ( bd1 ) valueOf 라는 메서드를 이용합니다. ( bd4 )

double 타입의 변수에는 0.01 를 대입하더라도

실제로는 0.01000000000000000020816681711721685132943093776702880859375 가 저장되기 때문에,

bd2 같은 녀석은 태어나자마자 BigDecimal 로서의 존재 가치를 상실하게 됩니다.

사칙연산 비교연산 및 형 변환은 BigDecimal과 유사합니다.

또, 자주 쓰는 0, 1, 10 은 상수로 저장( BigDecimal.ZERO , BigDecimal.ONE, BigDecimal.TEN) 되어 있어 유용합니다.

 

반응형

댓글