ABAP에서 숫자 연산을 처리할 때 TYPE P (Packed Number)는 매우 자주 사용된다. 이번 글에서는 Fixed Point Arithmetic 이 무엇인지, 해당 옵션의 체크 여부에 따라 어떻게 계산 결과가 달라지는지를 알아보자.
🔍 Fixed Point Arithmetic 정의
Fixed point arithmetic
If you mark this checkbox, all calculations in the program will use fixed point arithmetic.
If you do not, packed numbers (ABAP/4 type P, Dictionary types CURR, DEC or QUAN) will be treated as integers when they are used in assignments, comparisons, and calculations, irrespective of the number of decimal places defined. Intermediate results in arithmetic calculations will also be rounded to the next whole number. The number of decimal places defined is only taken into account when you output the answer using the WRITE statement.
✔️ Fixed point arithmetic 체크했을 때 (Default)
- 모든 계산이 고정 소수점 방식으로 수행되며, DECIMALS 설정이 실제 연산에 반영
❌ Fixed point arithmetic 체크해제했을 때
- TYPE P, CURR, DEC, QUAN과 같은 소수 타입들도 정수처럼 처리
- 소수점 아래 자릿수(DECIMALS)는 무시되며, 연산 결과는 내부적으로 반올림된 정수로 처리
1️⃣ Fixed Point Arithmetic 옵션 활성화된 경우 (체크 O)
🔹 예제 코드 1
DATA gv_1 TYPE p VALUE '1.1'.
DATA gv_2 TYPE p VALUE '2.1'.
DATA gv_3 TYPE p.
gv_3 = gv_1 * gv_2.
WRITE gv_3.
*결과: 2
DECIMALS가 명시되지 않은 상태에서는 소수점 이하 숫자가 무시되어, 내부적으로 정수 1 * 2로 계산되어 2가 출력된다.
🔹 예제 코드 2
DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.
DATA gv_6 TYPE p.
gv_6 = gv_4 * gv_5.
WRITE gv_6.
*결과: 2
입력 변수에는 DECIMALS가 설정되어 있지만, 결과를 저장하는 gv_6에는 소수점 자릿수가 명시되지 않아 정수값 2만 출력된다.
🔹 예제 코드 3
DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.
*DATA gv_6 TYPE p DECIMALS 1.
DATA gv_6 TYPE p DECIMALS 2.
gv_6 = gv_4 * gv_5.
WRITE gv_6.
*결과: 2.3 (DECIMALS 1일 때)
*결과: 2.31 (DECIMALS 2일 때)
모든 변수에 DECIMALS가 지정된 경우, 연산 과정과 출력 모두에서 소수점 자릿수가 정확하게 반영되어 2.31이 출력된다.
2️⃣ Fixed Point Arithmetic 옵션 비활성화된 경우 (체크 X)
결과 비교를 위해 Fixed Point Arithmetic 옵션에 체크했을 때 작성한 코드를 그대로 작성하여 결과를 비교해 보자.
🔹 예제 코드 1
DATA gv_1 TYPE p VALUE '1.1'.
DATA gv_2 TYPE p VALUE '2.1'.
DATA gv_3 TYPE p.
gv_3 = gv_1 * gv_2.
WRITE gv_3.
*결과: 231
Fixed Point Arithmetic 옵션이 꺼진 상태에서는 TYPE P 변수도 내부적으로 정수처럼 처리되며, '1.1'은 11, '2.1'은 21로 간주되어 곱셈 결과인 231이 출력된다.
🔹 예제 코드 2
DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.
DATA gv_6 TYPE p.
gv_6 = gv_4 * gv_5.
WRITE gv_6.
*결과: 231
입력 변수에 DECIMALS가 있어도, 옵션이 꺼진 상태에서는 무시되고 문자열 '1.1', '2.1'이 각각 11, 21로 처리되어 결과는 231이 된다.
🔹 예제 코드 3
DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.
*DATA gv_6 TYPE p DECIMALS 1.
DATA gv_6 TYPE p DECIMALS 2.
gv_6 = gv_4 * gv_5.
WRITE gv_6.
*결과: 23.1 (DECIMALS 1일 때)
*결과: 2.31 (DECIMALS 2일 때)
결과 23.1
DECIMALS가 1로 선언된 gv_6 변수는 소수점 자리 수가 부족해 곱셈 결과가 부정확하게 표현되어 23.1이라는 값이 출력된다.
결과 2.31
Fixed Point Arithmetic 옵션이 꺼진 상태에서도 모든 변수에 DECIMALS가 명시되어 있을 경우, 소수점 정보를 활용한 계산이 가능하며 결과는 2.31로 정확하게 출력된다.
📌 기억할 것
3가지 예제를 통해 Fixed Point Arithmetic 옵션 활성화 여부와 각 변수에 지정된 DECIMALS 설정이 계산 방식과 결과 출력에 결정적인 영향을 준다는 것을 확인할 수 있었다. 특히, 옵션이 비활성화된 경우에도 출력 변수의 DECIMALS 설정에 따라 결과값이 소수점 위치를 달리해 출력되므로, 정확한 계산을 위해서는 옵션 설정과 함께 변수의 DECIMALS 지정 여부를 꼼꼼히 확인하는 것이 중요하다.
'SAP' 카테고리의 다른 글
🔄 STATICS vs. DATA – ABAP 변수 선언의 차이점 비교 정리 (0) | 2025.06.09 |
---|---|
ABAP 시스템 변수로 날짜와 시간 다루기 - sy-datum, sy-datlo, sy-datar, sy-uzeit, sy-timlo (0) | 2025.05.30 |
ABAP CX_SY_DYN_CALL_ILLEGAL_FUNC - 부동소수점 계산과 동적 프로그래밍의 대소문자 구문 오류 해결 (0) | 2025.05.28 |
ABAP CX_SY_CONVERSION_OVERFLOW - Packed Type(P) 변수 오버플로우 에러 해결 (1) | 2025.05.26 |
BP (Business Partner) | 비즈니스 파트너 마스터 데이터 관리 (1) | 2025.04.10 |