awk 中的小数点四舍五入

Bha*_*ath 7 awk

我想使用 awk 将值 262.5 舍入为 263

我已经尝试过以下方法

echo "262.5" | awk '{printf "%.f\n", $1}'
Run Code Online (Sandbox Code Playgroud)

我的预期答案是 263

小智 6

正数略有不同:

echo "262.5" | awk '{ print int($1  + 0.5) } '
Run Code Online (Sandbox Code Playgroud)

(结果:263)

echo "262.4" | awk '{ print int($1  + 0.5) } '
Run Code Online (Sandbox Code Playgroud)

(结果:262)

四舍五入到小数点后第一位:

echo " " | awk '{ print int(5.89 * 0.3851 * 10 + 0.5)/10 } '
Run Code Online (Sandbox Code Playgroud)

(结果:2.3)

四舍五入到小数点后第二位:

echo " " | awk '{ print int(5.21 * 0.3851 * 100 + 0.5)/100 } '
Run Code Online (Sandbox Code Playgroud)

(结果:2.01)

等等...


use*_*686 4

根据GNU awk 手册

\n\n
\n

printf 和 sprintf()(请参阅 Printf)执行舍入的方式通常取决于系统的 C sprintf() 子例程。在许多机器上, sprintf() 舍入是 \xe2\x80\x9cunbiased,\xe2\x80\x9d这意味着它并不总是向上舍入尾部 \xe2\x80\x98.5\xe2\x80\x99 ,相反到天真的期望。在无偏舍入中,\xe2\x80\x98.5\xe2\x80\x99 舍入为偶数,而不是始终向上舍入,因此 1.5 舍入为 2,但 4.5 舍入为 4。

\n
\n\n

同一页面还有一个示例round()函数:

\n\n
function round(x, ival, aval, fraction)\n{\n   ival = int(x)    # integer part, int() truncates\n\n   # see if fractional part\n   if (ival == x)   # no fraction\n      return ival   # ensure no decimals\n\n   if (x < 0) {\n      aval = -x     # absolute value\n      ival = int(aval)\n      fraction = aval - ival\n      if (fraction >= .5)\n         return int(x) - 1   # -2.5 --> -3\n      else\n         return int(x)       # -2.3 --> -2\n   } else {\n      fraction = x - ival\n      if (fraction >= .5)\n         return ival + 1\n      else\n         return ival\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n