如何在 Bash 中将浮点数四舍五入保留三位小数?

7

我是一名新手bash学习者。我想输出输入表达式的结果,保留小数点后3位并进行四舍五入。

我可以使用以下代码,但它不进行四舍五入。比如,如果我将5+50*3/20 + (19*2)/7作为输入传递给下面这段代码,则输出结果为17.928。实际结果为17.92857...。因此,它是截断而不是四舍五入。我想要四舍五入,即输出应该是17.929。我的代码:

read a
echo "scale = 3; $a" | bc -l

等效的C++代码可以在main函数中实现:

float a = 5+50*3.0/20.0 + (19*2.0)/7.0;
cout<<setprecision(3)<<fixed<<a<<endl;

我不确定为什么,但我认为如果你将数字除以1,它会缩放数字。echo "scale = 3; $a / 1" | bc -l - ooga
@ooga,抱歉,它不起作用。 - Enamul Hassan
4个回答

10

关于什么?

a=`echo "5+50*3/20 + (19*2)/7" | bc -l`
a_rounded=`printf "%.3f" $a`
echo "a         = $a"
echo "a_rounded = $a_rounded"

输出

a         = 17.92857142857142857142
a_rounded = 17.929

?


3
尝试使用以下内容: 在这里,bc将为bash提供计算器功能,-l将读取字符串中的每个字符,最后我们仅打印三位小数。
read num
echo $num | bc -l | xargs printf "%.3f"

2
您可以使用awk命令来处理此问题:
awk 'BEGIN{printf "%.3f\n", (5+50*3/20 + (19*2)/7)}'
17.929

%.3f 输出格式会将数字四舍五入到小数点后三位。


这个对于这个字符串很好用。但是如果我把字符串作为输入,该如何实现呢?你可以看看我正在尝试做的这个。谢谢。 - Enamul Hassan

0
我认为有两个简单的解决方案:
read input 
var=$(echo "scale=4; $input" | bc) 
printf "%.3f\n" "$var"

第二个更简单。
printf "%.3f" $(cat - |bc -l)

哪里

cat - 从输入中读取数值。

| 将输入传递给下一个命令。

bc -l 执行所需的计算。

(...) 捕获输出。

printf "%.3f" 格式化并打印捕获的输出为带有三位小数的浮点数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接