[금융IT] 큰 금액은 어떻게 표기할까?
개요
64비트 intel아키텍쳐 기준으로, 숫자 자료형의 메모리는 다음과 같다.
언어 | 4바이트 | 8바이트 |
---|---|---|
C | int, long | long long |
C++ | int, long | long long |
java | int | long |
언어들의 경우 전부 큰 수를 표현하는데 지장이 있다.
그 이유는 당연하게도 수는 무한대지만 메모리 양은 무한하지 않기 때문이다.
자바에서 큰 정수을 처리하려면?
Type | 범위 |
---|---|
int | -2,147,483,648 ~ 2,147,483,647 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
자바 정수 타입 중, 가장 큰 범위를 갖고 있는 건 long이다.
- 그 범위를 넘어서게 되면 모두 0으로 출력이 된다.
long이 수용할 수 있는 범위보다 큰 정수를 출력하려면 라이브러리 java.math 패키지에 있는 BigInteger
클래스를 사용하면 된다.
- BigInteger은 문자열 형태로 이루어져 있어 숫자의 범위가 무한하기에 어떠한 숫자이든지 담을 수 있다.
BigInteger은 문자열이기에 사칙연산이 안된다.
- 그렇기에 BigInteger 내부의 숫자를 계산하기 위해서는 BigInteger 클래스 내부에 있는 메서드를 사용해야 한다.
출처: https://javariankm.tistory.com/26 [자바리안의 메모장], https://coding-factory.tistory.com/605 [코딩팩토리]
자바에서 큰 소수점을 처리하려면?
Type | 범위 |
---|---|
float | 1.4E-45 ~ 3.4028235E38 |
double | 4.9E-324 ~ 1.7976931348623157E308 |
소수점을 저장할 수 있는 타입인 float과 double은 소수점의 정밀도가 완벽하지 않아 값의 오차가 생길 수 있다.
- 소수점 이하의 수를 다룰 때 double과 float은 사칙연산 시 정확한 값을 출력하지 않을 수 있다.
- 그 이유는 내부적으로 수를 저장할 때 이진수의 근사치를 저장하기 때문이다.
그렇기에 미세한 숫자의 변동도 허용하지 않는 특히 돈과 소수점을 다룬다면 BigDecimal
을 사용해야 한다.
- BigDecimal은 속도는 느리지만 숫자가 어긋날 가능성을 미연에 방지할 수 있다.
BigDecimal은 문자열이기에 사칙연산이 안된다.
- 그렇기에 BigDecimal 내부의 숫자를 계산하기 위해서는 BigDecimal클래스 내부에 있는 메서드를 사용해야 한다.
출처: https://coding-factory.tistory.com/605 [코딩팩토리]
C언어에서 최대 자료형을 초과하는 경우 어떻게 처리할까?
양수의 최대값은 2,147,483,647 으로 10자리를 넘는 값을 표현 할 수 없다.
자료형 중 가장 큰 값을 표현 가능한 8byte 크기의 unsigned long long 인 ull 은 18,446,744,073,709,551,615 까지 표현 가능하며 20자리를 넘는 값을 표현 할 수 없다.
덧셈을 한 결과 값이 위 자료형의 크기를 초과 하는 경우에도 해당 자료형으로 값을 저장하는 경우 해당 값을 표현 할 수 없다.
이러한 경우 원하는 자리수 크기의 int 행렬을 이용해서 연산을 수행하고 char형 배열로 string 형태의 자료형으로 숫자 값을 구해야 한다.
구체적인 방법은 C언어에서 BigInteger 직접구현한 예제 에서 확인 가능하다.
출처: https://injunech.tistory.com/400 [GOGO]