我试图从浮点数中删除尾随的十进制零,但到目前为止没有运气。
echo "3/2" | bc -l | sed s/0\{1,\}\$//
1.50000000000000000000
我希望得到1.5
,但不知何故,尾随的零没有被截断。如果不是0\{1,\}
而是明确地写0或000000等,它会在输入时删除零,但显然我需要它是动态的。
0\{1,\}
出了什么问题?
答案 0 :(得分:10)
为什么不用scale
设置所需的位数?
$ echo "scale=1; 3/2" | bc -l
1.5
$ echo "scale=2; 3/2" | bc -l
1.50
$ echo "scale=5; 3/2" | bc -l
1.50000
我建议您浏览man bc
,因为它包含许多有趣的方式来展示您的结果。
答案 1 :(得分:8)
echo "3/2" | bc -l | sed '/\./ s/\.\{0,1\}0\{1,\}$//'
答案 2 :(得分:6)
$
不得转义并引用sed模式:
echo "3/2" | bc -l | sed 's/0\{1,\}$//'
1.5
答案 3 :(得分:2)
@anubhava有正确的理由让您的命令失败,但只需使用awk:
$ awk 'BEGIN{print 3/2}'
1.5
答案 4 :(得分:0)
您可以使用printf
:
printf "%.1f" $(bc -l <<< '3/2')
1.5
答案 5 :(得分:0)
修剪浮动数字的尾随零的一种方便方法是
grep --only-matching
选项:
$ echo 1 + 0.1340000010202010000012301000000000 | bc -l | grep -o '.*[1-9]'
1.1340000010202010000012301
-o, - 仅匹配
仅打印匹配行的匹配(非空)部分 这个部分在一个单独的输出线上。
答案 6 :(得分:0)
这是我的看法。它会删除前导零,然后,如果数字中的任何地方都有小数,它也会删除尾随零。此表达式还适用于数字(如果存在)之前或之后的数字。
sed -e "s/^\s*0*//" -e "/\./ s/0*\s*$//"