Bash 限制浮点变量的精度

Bash 限制浮点变量的精度

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

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

~/Desktop/MEEP$ printf "%.3f\n" $w
bash: printf: 0.005000: invalid number
0,000

语言环境的输出

@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=

的输出echo $w

@vesnog:~$ echo $w
0.005000

答案1

一个简单的方法是使用printf

$ printf "%.3f\n" 0.005000000000
0.005

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

$ printf "%.3f\n" 0.005000000000 | sed 's/^0//'
.005

答案2

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

例子

$ echo "300/7" | bc -l
42.85714285714285714285

为了限制精度,

$ echo "scale=2; 300/7" | bc -l
42.85

更新

$ echo "scale=3; 300/7" | bc -l | sed 's/[0-9]*\././g'
.857

答案3

此 sed 命令删除尾随零:

sed 's/\(0\.0*[1-9][1-9]*\)0*/\1/'

它会记住以 开头0.、后跟零个或多个0'、后跟 1-9 中的 1 个或多个数字、后跟零个或多个0' 的任何值。然后它会截断零个或多个尾随的0

这允许您解析出任意数量的尾随零,并保留任何大于零的任意低数字。不管它有多小。

例如

0.054000变成0.054,或者0.00000010000000变成0.0000001,等等。

欲了解更多信息,请查看 Grymoires Awesomesed教程。

答案4

为什么不使用 grep 呢?

echo "$your_number" | grep -o '.*[1-9]'

相关内容