Node:Round Function, Next:, Previous:Assert Function, Up:General Functions

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