The way printf
and sprintf
(see section Using printf
Statements for Fancier Printing)
do rounding will often depend
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.
The result is 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 # # Arnold Robbins, [email protected], August, 1996 # Public Domain 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) }
Go to the first, previous, next, last section, table of contents.