在 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=3345699
和n=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
就有足够的小数来正确舍入。
sum
和 n
,这些是 bash 个变量。您应该添加 $
以获得它们的值。所以,解决方案应该是:
echo "scale=5;($sum/$n)"|bc
1.71428
我将两个变量作为输入,将它们相除后,我希望将输出四舍五入到 5 位小数。我试过这种方式 ->
sum=12
n=7
output=$("scale=5;sum/n"|bc)
echo $output
我的代码没有显示任何输出。我能做什么??
测试用例:
如果sum=3345699
和n=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
就有足够的小数来正确舍入。
sum
和 n
,这些是 bash 个变量。您应该添加 $
以获得它们的值。所以,解决方案应该是:
echo "scale=5;($sum/$n)"|bc
1.71428