Bash 限制浮点变量的精度

Ves*_*nog 8 bash bc floating-point

在 Ubuntu 14.04.1 LTS 64-bitbash 中,我通过将浮点 bash 变量乘以bc比例设置为 3 来清除浮点变量;但是,我无法将小数点后的位数设为零并去掉小数点左侧的零。我怎样才能转化,说0.005000000.005?由于我的文件命名约定,这是必要的。感谢您的建议。

更新:我可以将它用于已经定义的 shell 变量并重新定义它们吗?以下代码给了我一个错误。

~/Desktop/MEEP$ printf "%.3f\n" $w
bash: printf: 0.005000: invalid number
0,000
Run Code Online (Sandbox Code Playgroud)

语言环境输出

@vesnog:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=tr_TR.UTF-8
LC_TIME=tr_TR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=tr_TR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=tr_TR.UTF-8
LC_NAME=tr_TR.UTF-8
LC_ADDRESS=tr_TR.UTF-8
LC_TELEPHONE=tr_TR.UTF-8
LC_MEASUREMENT=tr_TR.UTF-8
LC_IDENTIFICATION=tr_TR.UTF-8
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

的输出 echo $w

@vesnog:~$ echo $w
0.005000
Run Code Online (Sandbox Code Playgroud)

ter*_*don 10

一个简单的方法是使用printf

$ printf "%.3f\n" 0.005000000000
0.005
Run Code Online (Sandbox Code Playgroud)

要删除前导0,只需将其解析为sed

$ printf "%.3f\n" 0.005000000000 | sed 's/^0//'
.005
Run Code Online (Sandbox Code Playgroud)


Thu*_*shi 9

有一个特殊的变量叫做scale. 您可以设置此变量来限制精度。

例子

$ echo "300/7" | bc -l
42.85714285714285714285
Run Code Online (Sandbox Code Playgroud)

为了限制精度,

$ echo "scale=2; 300/7" | bc -l
42.85
Run Code Online (Sandbox Code Playgroud)

更新

$ echo "scale=3; 300/7" | bc -l | sed 's/[0-9]*\././g'
.857
Run Code Online (Sandbox Code Playgroud)