bash - 在Bash中,四舍五入取整

如何从两个除数取整,例如

 
3/2

 

 
testOne=$((3/2))

 

时间:

bash不会提供正确的3/2结果,因为它不会进行浮动数学运算。 你可以使用awk之类的工具


$ awk 'BEGIN { rounded = sprintf("%.0f", 3/2); print rounded }'
2

或bc


$ printf"%.0f" $(echo"scale=2;3/2" | bc)
2

要在算术中进行四舍五入,只需将(denom-1)添加到分子。

例子,舍入:

 
N/2
M/5
K/16

 

例子,舍入:


(N+1)/2
(M+4)/5
(K+15)/16


(N+1)/2
(M+2)/5
(K+8)/16

最好的办法是获得最接近的整数


var=2.5
echo $var | awk '{print int($1+0.5)}'

如果你的正整数的整数除法向零舍入,那么你可以将一个小于除数的除数添加到被除数。

也就是说,替换 X/Y(X + Y - 1)/Y

证明:

  • 案例 1: X = k * Y ( X 是Y的整数倍数): 在这种情况下,我们有 (k * Y + Y - 1)/Y ,它分割为 (k * Y)/Y + (Y - 1)/Y(Y - 1)/Y 部件舍入为零,而我们剩下的是 k的商。 这正是我们想要的: 当输入被整除时,我们希望调整的计算仍然能产生正确的精确商。

  • 案例2: X = k * Y + m 火警的警铃在哪里? 0 <m <Y ( X 不是Y的倍数) 。 在这种情况下,我们有一个 k * Y + m + Y - 1 ,或者 k * Y + Y + m - 1 我们可以把除法写出来 (k * Y)/Y + Y/Y + (m - 1)/Y0 <m <Y , 0 <= m - 1 <Y - 1 最后一个术语 (m - 1)/Y 到零。 我们剩下的是 (k * Y)/Y + Y/Y 哪些是 k + 1的。 这表明行为向上舍入。 如果我们有一个 XYk 多个,如果我们添加 1,该部门轮 k + 1

,但这个舍入是极端的;所有不精确的除法都远离零。 不如介于两者之间?

可以通过"启动"实现 Y/2的分子。 而不是 X/Y,计算 (X+Y/2)/Y 。 而不是证明,让我们来实证一下:


$ round()
> {
> echo $((($1 + $2/2)/$2))
> }
$ round 4 10
0
$ round 5 10
1
$ round 6 10
1
$ round 9 10
1
$ round 10 10
1
$ round 14 10
1
$ round 15 10
2

当除数是一个偶数,正数,如果分子数量相等的一半,这轮,轮下来如果它是小于。

例如 round 6 12 转到 1,所有的值都等于 6,模 12,像 18 ( 转到 2 ) 等等。 round 5 12 下降到 0

对于奇数,行为是正确的。 没有一个确切的有理数在两个连续的倍数之间。 比如,用 11的分母 5/11 <5.5/11 (exact middle) <6/11round 5 11 向下舍入,而 round 6 11 向上舍入。

小数点分隔符为逗号(例如: LC_NUMERIC=fr_FR.UTF-8,请参阅这里 ):


$ printf"%.0f" $(echo"scale=2;3/2" | bc) 
bash: printf: 1.50: nombre non valable
0


$ printf"%.0f" $(echo"scale=2;3/2" | bc | sed 's/[.]/,/')
2

或者


$ printf"%.0f" $(echo"scale=2;3/2" | bc | tr '.' ',')
2

另一种解决方案是在python命令中执行除法,例如:


$ numerator=90
$ denominator=7
$ python -c"print (round(${numerator}.0 / ${denominator}.0))"

我觉得这应该足够了。


$ echo"3/2" | bc 

要四舍五入,可以使用模数。

(true =1;false =0)

例如:3/2


answer=$(((3 / 2) + (3 % 2 > 0)))
echo $answer
2

例如:100/2


answer=$(((100 / 2) + (100 % 2 > 0)))
echo $answer
50

例如:100/3


answer=$(((100 / 3) + (100 % 3 > 0)))
echo $answer
34

...