如何格式化十进制数以显示前面的零而不显示后面的零?

如何格式化十进制数以显示前面的零而不显示后面的零?

我在 Ubuntu 14.04.1 LTS 64 位 bash 命令提示符上有以下脚本:

S=0.030
F=0.150
N=10
reso=20
DIFF=`echo "scale=3; $F - $S" | bc -l`
df=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $df" | bc -l`
if=`echo "scale=3; $F / $df" | bc -l`
cd wgdisp-out
for i in `seq 0 $N` 
    do
        f=`echo "scale=3; $S + $i * $df" | bc -l | awk ' sub("\\.*0+$","") '`
        #h5totxt hsli0$f.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n '/^[[:digit:]]/p' | cut -d , -f 1
        echo $f
    done

我希望将 f 显示为0.03, 0.042, 0.054, .... 0.138, 0.15,这很重要,因为 f 在文件名中使用,例如hsli0.03.h5.有人能指出我正确的方向吗?我对 shell 中的算术不太熟悉。

编辑:我尝试了以下构造,但它没有产生所需的输出;此外,缩放选项bc似乎不起作用。

f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./' -e 's/$^\/0/./'`

编辑2:使用以下单个命令即可使其工作:

f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./;s/[0]*$//g'`

答案1

bcscale是一个特殊变量,用于限制规模(逗号后的位数)某些运算符(例如/(除法))的结果。它不是 所显示的数字的精度bc,它用于计算。

例如,在 中scale=1; 1/3,结果是0.3( 3/10),与 相差甚远1/3

您应该在计算中使用大比例值,并且仅在显示时减少(例如,最后scale除以)。1

比较:

$ echo "scale=100; r=1/3*300; scale=3; r/1" | bc
99.999

和:

$ echo "scale=3; 1/3*300" | bc
99.900

我会这样写:

n=10
echo "
  s = 0.030
  f = 0.150
  n = $n
  r = 20
  scale = 100
  d = (f - s) / n
  scale = 3
  for (i = s; i <= f; i += d) i/1" |
    bc |
    sed 's/^\./0./;s/0*$//' |
    while read f; do
      h5totxt "hsli$f.h5" | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200
    done

答案2

bash 中的浮点运算支持非常差。不过,您仍然可以使用printf

printf '%5.3f\n' $f
printf '%.3g\n' $f

如果您只想在 . 前面添加 0,则可以使用参数扩展:

f=${f/#./0.}
# if negative numbers are possible, too
f=${f/#-./-0.}

相关内容