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}'My expected answer is 263
3 Answers
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 }
} 1 echo "262.5" | awk '{printf "%.f\n", int($1+0.5)}' 1