#### 10.2.3 Rounding Numbers ¶

The way `printf`

and `sprintf()`

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