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) }