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').
반응형