SAP/ABAP

[Predefined ABAP Type] Numeric

멍냐옹2 2023. 4. 3. 11:25
반응형

Numeric Data Type 

: 숫자형 데이터 타입

 

종류

  Data Type 초기길이 가능길이 범위 설명
숫자
I (Integer Number) 4 4  -2147483648 ~ +2147483647  
P (Packed Number) 8 1-16   두 자리 =  1byte
마지막 바이트 = 한 자리 + 부호
최대 14개의 소수점 이하 자릿수
F (Floating Point Number) 8 8   지수 Type 이므로 출력시 변환 필

*I 범위 구하는 방법

4byte = 32bit (1byte = 8bit)

2^32 = 4,294,967,296

음수 ~ 양수 구간이 존재하므로 - 2,147,483,648 ~ 2,147,483,647

양수가 1개 적은 이유는 0을 포함하기 때문

 

P vs F 차이

- P : 정확한 값 계산을 위해 사용

- F : 내부 이진법 계산으로 인해 반올림 오류 발생할 수 있음.  매우 작거나 큰 수에  사용

 

예제 

*i 타입은 소수점이 존재하지 않기 때문에 '' 사용 유무와 상관없이 동일한 출력값을 가짐.
DATA gv_i1 TYPE i.
gv_i1 = '2147483647'.
WRITE / gv_i1.

gv_i1 = 2147483647.
WRITE / gv_i1.

*p도 소수점 사용 하지 않을 경우에는 '' 유무 상관 없음.
DATA gv_p1 TYPE p.
gv_p1 = 123456789012345.
WRITE : / 'gv_p1 : ', gv_p1.

gv_p1 = '123456789012345'.
WRITE : / 'gv_p1 : ', gv_p1.

*오류 발생. default로 8byte라 16자리 까지 되지만, 마지막 자리는 부호 자리기 때문에 15자리 까지 허용
*gv_p1 = 1234567890123456.
*WRITE / gv_p1.

*DECIMAL 설정 하지 않아서 소수점 표시 되지 않음.
gv_p1 = '1234567890.123456'.
WRITE / gv_p1.

* 소수점은 최대 14자리 까지 가능
* Number of decimal places specified in "15" is too great: Maximum allowed is 14. .
* DATA gv_p2 TYPE p DECIMALS 15.
DATA gv_p2 TYPE p DECIMALS 14.
gv_p2 = '1.12345678901234'.
WRITE / gv_p2.

* f Type 선언
DATA gv_f1 TYPE f.
gv_f1 = '1.2'.
WRITE / gv_f1.

DATA gv_c1 TYPE c LENGTH 10.

* F Type은 지수로 출력 되기 때문에 다른 문자열로 변환하여 출력 필요
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
  EXPORTING
    DECIM = 2
    INPUT = gv_f1
  IMPORTING
    FLSTR = gv_c1.

WRITE / gv_c1.

 

연산자 함수

기호 의미 예시 동일 키워드
+ 더하기 n + m ADD n TO m
- 빼기 n - m SUBTRACT n FROM m
* 곱하기 n * m MULTIPLY m BY n
/ 나누기 n / m DIVIDE m BY n
DIV 나누기 n DIV m  
MOD 나머지 n MOD m  
**  제곱 n ** m  

 

예제

DATA : gv_i1 TYPE i VALUE 1,
       gv_i2 TYPE i VALUE 2,
       gv_iresult TYPE i.

WRITE : / 'gv_i1 : ', gv_i1, 'gv_i2 : ', gv_i2.

* 더하기
gv_iresult = gv_i1 + gv_i2.
WRITE : / 'gv_i1 + gv_i2 : ', gv_iresult.

* 빼기
gv_iresult = gv_i2 - gv_i1.
WRITE : / 'gv_i2 - gv_i1 : ', gv_iresult.

* 곱하기
gv_iresult = gv_i2 * gv_i1.
WRITE : / 'gv_i2 * gv_i1 : ', gv_iresult.

* 나누기
gv_iresult = gv_i2 / gv_i1.
WRITE : / 'gv_i2 / gv_i1 : ', gv_iresult.

* 나누기 (DIV)
gv_iresult = gv_i2 DIV gv_i1.
WRITE : / 'gv_i2 DIV gv_i1 : ', gv_iresult.

* 나누기의 나머지 (MOD)
gv_iresult = gv_i2 MOD gv_i1.
WRITE : / 'gv_i2 MOD gv_i1 : ', gv_iresult.

* 제곱
gv_iresult = gv_i2 ** gv_i1.
WRITE : / 'gv_i2 ** gv_i1 : ', gv_iresult.

 

Numeric Data Type 함수

함수 내역 예시
 ABS 절대값 리턴  ABS(-100) = 100
SIGN 부호 결과 리턴 마이너스 -1, 0, 플러스 +
CEIL 해당 값보다 작지 않은 정수 리턴 ceil(1.3), ceil(1.7) = 2
FLOOR CEIL의 반대 ceil(1.3), ceil(1.7) = 1
TRUNC 소수점 버리고 정수만 trunc(1.3), trunc(1.7) = 1
FRAC 소수점 이하 자리만 trunct(2.9) = 0.9

 

예제

WRITE : / 'ABS    : ', ABS('-100').
WRITE : / 'SIGN(-)   : ', SIGN('-123').
WRITE : / 'SIGN(+)   : ', SIGN('123').
WRITE : / 'SIGN(0)   : ', SIGN('0').
WRITE : / 'CEIL   : ', CEIL('-1.3').
WRITE : / 'CEIL   : ', CEIL('1.3').
WRITE : / 'FLOOR  : ', FLOOR('-1.3').
WRITE : / 'FLOOR  : ', FLOOR('1.3').
WRITE : / 'TRUNC  : ', TRUNC('-1.8').
WRITE : / 'TRUNC  : ', TRUNC('1.8').
WRITE : / 'FRAC   : ', FRAC('-3.4').
WRITE : / 'FRAC   : ', FRAC('3.4').

 

 

반응형