# Round off the decimal value in awk

i want to round off the value 262.5 to 263 using awk

i have tried the below

``````echo "262.5" | awk '{printf "%.f\n", \$1}'
``````

Little different for positive numbers:

``````echo "262.5" | awk '{ print int(\$1  + 0.5) } '
``````

(Result: 263)

``````echo "262.4" | awk '{ print int(\$1  + 0.5) } '
``````

(Result: 262)

Rounding on 1st decimal place:

``````echo " " | awk '{ print int(5.89 * 0.3851 * 10 + 0.5)/10 } '
``````

(Result: 2.3)

Rounding on 2nd decimal place:

``````echo " " | awk '{ print int(5.21 * 0.3851 * 100 + 0.5)/100 } '
``````

(Result: 2.01)

And so on...

According to the GNU awk manual,

The way printf and sprintf() (see 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.

The same page also has an example `round()` function:

``````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
}
}
``````
• Hi grawity, is there any option to check whether sprintf() function is unbiased or not Oct 10, 2013 at 5:58
``````echo "262.5" | awk '{printf "%.f\n", int(\$1+0.5)}'
``````
• Mind adding a short explanation to your command? Aug 13, 2018 at 20:53