1. 程式人生 > >向上取整;向下取整;四捨五入

向上取整;向下取整;四捨五入

REPORT z_zcd_013.
DATA:a TYPE mseg-menge,
     b TYPE mseg-menge,
     c TYPE mseg-menge.

a = '1.36'.
b = '1.34'.
c = a / b.
WRITE:/,c. "輸出 1.015
c = CEIL( a / b ).
WRITE:/,c. "輸出 2.000
c = FLOOR( a / b ).
WRITE:/,c. "輸出 1.000


四捨五入的函式

ABAP 中處理資料的函式方法很多,其中涉及到四捨五入的有兩個(可能還有更多):ROUND 和 HR_NZ_ROUNDING_DECIMALS
前者位於Basis功能開發包 SZME 裡面,在標準中用於計量單位的計算;
後者主要用於HR模組,位於 PB43 開發包,處理HR模組中的主資料。

HR_NZ_ROUNDING_DECIMALS 函式可以直接輸入數值,然後在 CONV_DEC 引數中輸入需要保留的小數點即可輸出。
ROUND 函式則有點靈活,可以通過 SIGN 引數( ‘+’,’-’ )控制向上取捨,或者向下取捨。

例如:
輸入 88.54350 ,如果SIGN = ‘+’ ,保留2位小數,會得到: 88.55000;如果 SIGN = ‘-’,會得到:88.54000
輸入 -88.54350,如果SIGN = ‘+’ ,保留2位小數,會得到: -88.54000;如果 SIGN = ‘-’,會得到:-88.55000

程式程式碼:
DATA : dat  TYPE p DECIMALS 9 VALUE '12.5445',
       dat1 TYPE p DECIMALS 9,
       dat2 TYPE p DECIMALS 9 VALUE '12.540'.

* 方法一
CALL FUNCTION 'HR_NZ_ROUNDING_DECIMALS'
  EXPORTING
    value_in                 = dat
    conv_dec                 = 2      " 設定保留幾位小數,從小數點最後一位進位
  IMPORTING
    value_out                = dat1
  EXCEPTIONS
    no_rounding_required     = 1
    decimals_greater_than_10 = 2
    rounding_error           = 3
    OTHERS                   = 4.

WRITE: /'方法一(保留2位小數):'.
WRITE: / dat, ' => ' ,dat1.
WRITE: / '----------------------------------------------------'.
 

* 方法二

CALL FUNCTION 'ROUND'
  EXPORTING
    decimals      = 0       " 保留多少位小數
    input         = dat2
    sign          = '+'     " + 向上取捨 - 向下取捨 (負數也一樣)
  IMPORTING
    output        = dat1    " 輸出返回結果
  EXCEPTIONS
    input_invalid = 1
    overflow      = 2
    type_invalid  = 3
    OTHERS        = 4.

WRITE: /'方法二(保留0位小數):'.
WRITE: / dat2, ' => ' ,dat1.
WRITE: / '----------------------------------------------------'.