스프링 인강을 듣다가 환율에 대해 변수 선언중에 정확한 소수점 계산을 위해
변수의 타입을 BigDecimal로 쓰는것이였습니다.
처음보는 변수타입이다보니 기능 정리 겸 쓰는이유와 장단점 등 을 정리하려 합니다.
불변의 성질을 띠며, 임의 정밀도와 부호를 지니는 10진수라고 표현합니다.
임의 정밀도는 간단하게 말하면, 아무리 큰숫자라도 표현 할 수 있는 것을 의미합니다(거의 무한에 가깝지만 무한은 아니라고합니다.)
임의정밀도 연산은 보통 큰숫자를 배열에 나눠 담아 계산하는 형식입니다.
BigDecimal은 이러한 임의정밀도 연산을 내부적으로 활용하는것 뿐만 아니라 연산을 활용하는 동시에 불변이므로 BigDecimal 객체간의 연산마다 새로운 객체를 생성하여 동작합니다.
그럼 int 나 BigInt 또는 Long 으로 대체 가능한거 아닌가싶지만, 앞에 나온 변수타입은 실수의 표현이 안되기때문에 대체할 수 없습니다.
그럼 실수 표현이 가능한 float나 double은 실수 표현이 가능한데, 대체변수타입으로 쓸 수 있을까 했지만
이또한 정확한 계산을 하기엔 많은 오류들이 있다고합니다.
float 는 4바이트 32비트로 구성되어있는 변수타입이고 7자리의 10진수 정도의 정밀도를 가집니다.
이로인해 매우 작은 숫자나 매우 큰 숫자를 표현할 떄에 정밀도 손실이 발생하거나 오버플로우 또는 언더 플로우가 발생할 수 있습니다.
또한 연산식 에서 반복적이거나 연산 순서에 따라 오차가 발생할 가능성이 있습니다.
double 은 8바이트 64비트에 15자리 십진수를 가질수 있어 float 보다는 정밀도는 높은편이지만,
여전히 큰숫자에 대한 정밀도 손상이 가능한 범위 입니다.
또한 부동 소수점 방식으로 숫자를 표현하기 때문에, 특정 소수를 정확하게 표현하지 못하고 근사치로 표현하여
연산에 큰 오류를 낼 수 있습니다.


테스트 결과 두 숫자 모두 원하는 값을 얻었지만

두 타입의 변수값들중 하나씩 입력할 수 있는 값을 초과하여 실행시켜보면

이처럼 연산 결과에 오류가 생기는것을 볼 수 있습니다.

방금 전 double 연산식에서 오류가 났던 숫자들을 가져와서 BigDecimal 에 적용 시켜 실행 해보았습니다.

결과는 원하는 값을 정확하게 표현 해냈습니다.
이처럼 다른 타입보다 더 큰 값을 계산할 수 있는 BigDecimal 은 금융쪽에서 필수적으로 쓰이고있다고합니다.