manpagez: man pages & more
info gawk
Home | html | info | man

File: gawk.info,  Node: Round Function,  Next: Cliff Random Function,  Prev: Assert Function,  Up: General Functions

10.2.3 Rounding Numbers
-----------------------

The way 'printf' and 'sprintf()' (*note Printf::) 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) }

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.