Round values up to nears value


The ROUND' command only rounds to nearest value whether it be up or down. Therefor the following code demonstrates how to always round a number UP 1 or 2 decimal places.


*Rounds a value UP to 2 decimal places
REPORT  zround2.
PARAMETER: p_value type p decimals 3 default '22.123'.

DATA: d_value type p decimals 2,
      d_int1 TYPE i,
      d_int2 TYPE i,
      d_number(20)     TYPE c,
      d_num_result(20) TYPE c,
      d_decimal(2)     TYPE c.


****************************************************************
*START-OF-SELECTION.
START-OF-SELECTION.


d_number = p_value.
SHIFT d_number LEFT UP TO '.'.
SHIFT d_number LEFT.
d_decimal = d_number+0(2).
d_decimal = d_decimal + 1.

Clear: d_number.
d_number = p_value.
SHIFT d_number RIGHT DELETING TRAILING '123456789 '.
SHIFT d_number LEFT DELETING LEADING ' '.
CONCATENATE d_number d_decimal INTO d_num_result.

d_value = d_num_result.

write:/ 'Value rounded up to 2 decimal places is ', d_value.


*Rounds a value UP to 1 decimal place
REPORT  zround1.
PARAMETER: p_value TYPE p DECIMALS 3 DEFAULT '22.123'.

DATA: d_value TYPE p DECIMALS 1,
      d_int1 TYPE i,
      d_int2 TYPE i,
      d_number(20)     TYPE c,
      d_num_result(20) TYPE c,
      d_decimal(2)     TYPE c.


****************************************************************
*START-OF-SELECTION.
START-OF-SELECTION.

  d_number = p_value / 10.
  SHIFT d_number LEFT UP TO '.'.
  SHIFT d_number LEFT.
  d_decimal = d_number+0(2).
  d_decimal = d_decimal + 1.

  CLEAR: d_number.
  d_number = p_value / 10.
  SHIFT d_number RIGHT DELETING TRAILING '123456789 '.
  SHIFT d_number LEFT DELETING LEADING ' '.
  CONCATENATE d_number d_decimal INTO d_num_result.

  d_value = d_num_result * 10.

  WRITE:/ 'Value rounded up to 2 decimal places is ', d_value.