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

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

'1.36' .
'1.34' .
a / b .
WRITE :/ , c "输出 1.015
CEIL a / b  ) .
WRITE :/ , c "输出 2.000
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 DECIMALS  VALUE  '12.5445' ,
       dat1  TYPE DECIMALS  9 ,
       dat2  TYPE DECIMALS  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'----------------------------------------------------'.


你可能感兴趣的:(ABAP)