用正确的四舍五入逼近一个浮点数

hba*_*ega 3 shell-script floating-point

如何使用 shell 脚本来近似浮点数(例如,小数点后最多 4 位数字)?我有两个例子:

A=1.2345678B=1.2345678E-05

所以我想得到A=1.2346B=1.2346E-05

我可以A使用cut以下方法快速完成工作:

A=`echo $A | cut -c1-6`
Run Code Online (Sandbox Code Playgroud)

但这给了我A=1.2345我期望最后一位四舍五入的位置6(因为下一位数字大于 5)。它也只适用于小数点前的一位数(如果我想近似100.2345678怎么办?)同样适用B

ter*_*don 8

使用printf

$ printf "%.4f\n" "$A"
1.2346
$ printf "%.4f\n" "$B"
0.0000
$ printf "%.4e\n" "$B"
1.2346e-05
$ printf "%.14f\n" "$B"
0.00001234567800
$ printf "%.4g\n" "$B"
1.235e-05
$ printf "%.4g\n" "$A"
1.235
Run Code Online (Sandbox Code Playgroud)

由于%e可能会更改指数,为了确保保持不变,您可以使用 shell 的字符串操作功能将数字与指数分开并分别打印:

$ B=100.12345678E-05  
$ printf '%.5fE%s\n' "${B%E*}" "${B##*E}"
100.12346E-05
Run Code Online (Sandbox Code Playgroud)

${B%E*}打印一切都交给第一E${B##*E}是第一之后的所有内容E

  • +1 或两者都使用 `%.4g` 并让 `printf` 应用是否使用 `e` 格式的默认规则 (2认同)