midrange.com code scratchpad
Name:
Variable Rounding
Scriptlanguage:
Plain Text
Tabwidth:
4
Date:
03/19/2013 09:15:02 pm
IP:
Logged
Description:
Our workplace has a need for rounding based on the precision our clients want to see. This is how we do the rounding.
Code:
  1. From copybook:
  2.      D ROUND_DOWN      C                   'D'
  3.      D ROUND_NORMAL    C                   'R'
  4.      D ROUND_UP        C                   'U'  
  5.  
  6.  
  7.       //=======================================================================*
  8.       //    Procedure:  $RoundNumber                                           *
  9.       //  Description:  Round the Number given to the decimal precision        *
  10.       //                provided.                                              *
  11.       //                                                                       *
  12.       //   Parameters:                                                         *
  13.       //     Input - Number to round                                           *
  14.       //     Input - Number of decimal positions to round to                   *
  15.       //     Input - (optional) Round Code                                     *
  16.       //   Inp/Out - n/a                                                       *
  17.       //    Output - n/a                                                       *
  18.       //                                                                       *
  19.       //  Return Value: Rounded Number                                         *
  20.       //                                                                       *
  21.       //-----------------------------------------------------------------------*
  22.      P $RoundNumber    B                   Export
  23.      D                 PI            21p 9
  24.      D  Number                             Const Like( $RoundNumber )
  25.      D  DecPos                        1p 0 Const
  26.      D  epRoundCode                   1a   Const Options( *omit: *nopass )
  27.      
  28.       //  Local Constants
  29.      D LEN_Number      C                   %len( Number )
  30.      
  31.       //  Local variables
  32.      D cvtNumber       S                   Like( $RoundNumber )
  33.      D RoundAdjust     S              9p 9
  34.      D RoundCode       S                   Like( epRoundCode )
  35.      D rtnNumber       S                   Like( $RoundNumber )
  36.       //-----------------------------------------------------------------------*
  37.       /free
  38.      
  39.        //  If the Round Code parameter was passed, load it.
  40.        If %parms >= %parmNum( epRoundCode ) and %addr( epRoundCode ) <> *null;
  41.          RoundCode = epRoundCode;
  42.        EndIf;
  43.      
  44.      
  45.        //  See if the number to Round needs to be adjusted for a specific
  46.        //  rounding style.
  47.        Select;
  48.      
  49.          //  Rounding Up or Down
  50.          When RoundCode = ROUND_UP or RoundCode = ROUND_DOWN;
  51.      
  52.            //  When adjusting to round up or down, the number needs to be
  53.            //  modified first.  The formula to create the adjustment:
  54.            //  *  Using a base of 5, change it to a decimal by dividing it by
  55.            //     10 to the power of the # decimal positions + 1.
  56.            //  *  Operator ** means "to the power of"
  57.            //  *  Example.
  58.            //     4.9 / (10 ** (3 +1)) = 4.9 / (10 ** 4) = 4.9 / 10000 = .000049
  59.      
  60.            //  !!  Need as many 9's after the decimal as there are decimal
  61.            //      places in RoundAdjust.  RoundAdjust should be as many
  62.            //      decimals as there are in CvtNumber.
  63.            RoundAdjust = 4.999999999 / (10 ** (DecPos +1));
  64.      
  65.            //  When rounding down, make the adjustment negative.
  66.            If RoundCode = ROUND_DOWN;
  67.              RoundAdjust *= -1;
  68.            EndIf;
  69.      
  70.            cvtNumber = Number + RoundAdjust;
  71.      
  72.          //  Otherwise Round as normal.
  73.          Other;
  74.            cvtNumber = Number;
  75.      
  76.        EndSl;
  77.  
  78.        Select;
  79.  
  80.          When DecPos = 0;
  81.            rtnNumber = %dech( cvtNumber: LEN_Number: 0 );
  82.  
  83.          When DecPos = 1;
  84.            rtnNumber = %dech( cvtNumber: LEN_Number: 1 );
  85.  
  86.          When DecPos = 2;
  87.            rtnNumber = %dech( cvtNumber: LEN_Number: 2 );
  88.  
  89.          When DecPos = 3;
  90.            rtnNumber = %dech( cvtNumber: LEN_Number: 3 );
  91.  
  92.          When DecPos = 4;
  93.            rtnNumber = %dech( cvtNumber: LEN_Number: 4 );
  94.  
  95.          When DecPos = 5;
  96.            rtnNumber = %dech( cvtNumber: LEN_Number: 5 );
  97.  
  98.          When DecPos = 6;
  99.            rtnNumber = %dech( cvtNumber: LEN_Number: 6 );
  100.  
  101.          When DecPos = 7;
  102.            rtnNumber = %dech( cvtNumber: LEN_Number: 7 );
  103.  
  104.          When DecPos = 8;
  105.            rtnNumber = %dech( cvtNumber: LEN_Number: 8 );
  106.  
  107.          When DecPos = 9;
  108.            rtnNumber = %dech( cvtNumber: LEN_Number: 9 );
  109.  
  110.        EndSl;
  111.  
  112.        Return rtnNumber;
  113.  
  114.       /end-free
  115.      P $RoundNumber    E
  116.       //-----------------------------------------------------------------------* 
© 2004-2019 by midrange.com generated in 0.007s valid xhtml & css