GNU Info

Info Node: (gawk.info)Round Function

(gawk.info)Round Function


Next: Cliff Random Function Prev: Assert Function Up: General Functions
Enter node , (file) or (file)node

Rounding Numbers
----------------

   The way `printf' and `sprintf' (Note: 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 --- 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 x
     
        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) }


automatically generated by info2www version 1.2.2.9