Способ округления в printf и sprintf (см. раздел 6.5 [Употребление операторов printf для декоративной печати], стр. 64) часто зависит от подпрограммы sprintf системы Си. На многих машинах sprintf округляет "unbiased " ("беспристрастно"), что означает, что округление при отбрасывании .5' не всегда происходит с избытком, в противоположность наивному ожиданию. При беспристрастном округлении `.5' округляется до четного, а не всегда с избытком, так что 1.5 округляется до 2, а 4.5 до 4. В результате если вы пользуетесь форматом без округления (например, "%.0f"), вы должны проверять, что делает ваша система. Следующая функция округляет традиционно; она может оказаться полезной, если ваша awk printf округляет беспристрастно.
# round --- делать нормальное округление
# # Arnold Robbins, arnold@gnu.org, August, 1996
# Public Domain
function round(x, ival, aval, fraction) -
ival = int(x) # целая часть, int() усекает
# проверка наличия дробной части
if (ival == x) # нет дробной части
return x
if (x ! 0) -
aval = -x # абсолютное значение ival = int(aval) дробное = 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 "" ""
# для проверки - print $0, round($0) ""