在 bash 中,如何除以两个变量并输出四舍五入到 5 位小数的答案?

In bash how do I divide two variables and output the answer rounded upto 5 decimal digits?

我将两个变量作为输入,将它们相除后,我希望将输出四舍五入到 5 位小数。我试过这种方式 ->

sum=12
n=7
output=$("scale=5;sum/n"|bc)
echo $output

我的代码没有显示任何输出。我能做什么??

测试用例:

如果sum=3345699n=1000000(sum/n)=3.345699,应该改为3.34570

awk 'BEGIN{sum=12;n=7;printf "%0.5f\n", sum/n}'
1.71429

在此解决方案中,awk 使用 printf 将小数点四舍五入到 5 位。如果您希望传递 bash 变量,请使用以下内容:

 awk -v sum=12 -v n=7 'BEGIN{printf "%0.5f\n", sum/n}'
 1.71429

旁注,awk 似乎在算术方面很好 :

sh-4.1$  time echo "scale=5; 12/7" | bc ;  time echo "scale=5;($sum/$n)"|bc;time awk 'BEGIN{sum=12;n=7;printf "%0.5f\n", sum/n}'
1.71428

real    0m0.004s
user    0m0.001s
sys     0m0.002s
1.71428

real    0m0.004s
user    0m0.001s
sys     0m0.001s
1.71429

real    0m0.002s
user    0m0.001s
sys     0m0.000s
sh-4.1$

这里的问题是您错过了 echo(或 printf 或任何其他东西)向 bc 提供数据:

$ echo "scale=5; 12/7" | bc
1.71428

此外,正如 cnicutar 在评论中指出的那样,您需要使用 $ 来引用变量。 sum是一个字符串,$sum是变量sum的值。
总之,您的代码段应该是这样的:

sum=12
n=7
output=$(echo "scale=5;$sum/$n" | bc)
echo "$output"

这个returns1.71428.

否则,使用 "scale=5;sum/n"|bc 你只是在管道分配并使 bc 失败:

$ "scale=5;sum/n"|bc
bash: scale=5;sum/n: No such file or directory

然后您说您希望对结果进行四舍五入,但现在不会发生:

$ sum=3345699
$ n=1000000
$ echo "scale=5;($sum/$n)" | bc
3.34569

这需要不同的方法,因为 bc 不四舍五入。您可以将 printf%.Xf 一起使用以四舍五入为 X 十进制数,这样:

$ printf "%.5f" "$(echo "scale=10;$sum/$n" | bc)"
3.34570

看到我给它一个大比例尺,这样 printf 就有足够的小数来正确舍入。

sumn,这些是 bash 个变量。您应该添加 $ 以获得它们的值。所以,解决方案应该是:

echo "scale=5;($sum/$n)"|bc
1.71428