gawk: Round Function

 
 10.2.3 Rounding Numbers
 -----------------------
 
 The way 'printf' and 'sprintf()' (SeePrintf) perform rounding often
 depends upon the system's C 'sprintf()' subroutine.  On many machines,
 'sprintf()' rounding is "unbiased", which means it doesn't always round
 a trailing .5 up, contrary to naive expectations.  In unbiased rounding,
 .5 rounds to even, rather than always up, so 1.5 rounds to 2 but 4.5
 rounds to 4.  This means that if you are using a format that does
 rounding (e.g., '"%.0f"'), you should check what your system does.  The
 following function does traditional rounding; it might be useful if your
 'awk''s 'printf' does unbiased rounding:
 
      # round.awk --- do normal rounding
 
      function round(x,   ival, aval, fraction)
      {
         ival = int(x)    # integer part, int() truncates
 
         # see if fractional part
         if (ival == x)   # no fraction
            return ival   # ensure no decimals
 
         if (x < 0) {
            aval = -x     # absolute value
            ival = int(aval)
            fraction = aval - ival
            if (fraction >= .5)
               return int(x) - 1   # -2.5 --> -3
            else
               return int(x)       # -2.3 --> -2
         } else {
            fraction = x - ival
            if (fraction >= .5)
               return ival + 1
            else
               return ival
         }
      }
      # test harness
      # { print $0, round($0) }