在 awk 中对小数进行四舍五入

在 awk 中对小数进行四舍五入

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

我已经尝试过以下

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

我的预期答案是 263

答案1

对于正数来说差别不大:

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

(结果:263)

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

(结果:262)

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

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

(结果:2.3)

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

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

(结果:2.01)

等等...

答案2

根据GNU awk 手册

printf 和 sprintf()(参见 Printf)执行舍入的方式通常取决于系统的 C sprintf() 子程序。在许多机器上,sprintf() 舍入是“无偏的”,这意味着它并不总是将尾随的“.5”向上舍入,这与天真的预期相反。在无偏舍入中,“.5”舍入为偶数,而不是一直上升,所以 1.5 轮比 2 轮高,但 4.5 轮比 4 轮高。

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

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
   }
}

答案3

echo "262.5" | awk '{printf "%.f\n", int($1+0.5)}'

相关内容