gawk: Round Function
10.2.3 Rounding Numbers
-----------------------
The way 'printf' and 'sprintf()' (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) }