[금융IT] 큰 금액은 어떻게 표기할까?

1 분 소요

개요

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]

태그: ,

카테고리:

업데이트: