Next: Cliff Random Function, Previous: Assert Function, Up: General Functions [Contents][Index]
The way printf and sprintf()
(see section Using printf Statements for Fancier Printing)
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) }