bash 四舍五入到最接近的 4 的倍数

bash round to nearest multiple of 4

我需要在将行数除以 25 后得到最接近的 4 的倍数。

   line= wc -l < file.txt
   # 47322487 lines

   parts= $line/25
   # 1892899.48 after division

   round 1892899.48 this to nearest multiple of 4. 

我建议您使用 awk 解决整个问题:

awk 'END { print int((NR / 100) + 0.5) * 4 }' file.txt

这会将行数除以 25 * 4,然后使用 int 舍入结果,然后再乘以 4。

添加

0.5,以便将值四舍五入到最接近的值。要始终向下取整,您可以将其删除;要始终向上取整,您可以添加 1。

一个非常简单的处理方法是先除以 100,然后乘以 4,然后加上 50 舍入该数字。

expr '(' $line + 50 ')'  / 100 '*' 4

四舍五入到最接近的 4 的倍数,将 6 和 10 都四舍五入为 8。

awk '{print sprintf("%.0f",[=10=]/4)*4}'

四舍五入到最接近的 4 的倍数,始终四舍五入 4 的模为 2 或 -2 的数字。

jq -R 'tonumber/4+.5|floor*4'

四舍五入到最接近的 4 的倍数,假设所有数字都是非负数,总是向上舍入 4 的模为 2 或 -2 的数字。对于大多数负数,这给出了错误的结果。

awk '{print int(([=12=]/4)+0.5)*4}'

四舍五入到 4 的倍数。

awk '{print[=13=]+(n-[=13=]%n)%n}' n=4
perl -MPOSIX -lpe'$_=ceil($_/4)*4'

四舍五入为 4 的倍数。

awk '{print[=14=]+(n-[=14=]%n)%n}' n=-4
perl -MPOSIX -lpe'$_=floor($_/4)*4'
jq -R 'tonumber/4|floor*4'
awk '{i=int([=14=]/4);print((i==[=14=]||[=14=]>0)?i:i-1)*4}'

将正数舍入为 4 的倍数,将负数舍入为 4 的倍数。

awk '{print int([=15=]/4)*4}'