Bash 在脚本中,以高精度计算浮点,并以低精度存储在shell变量值中

Bash 在脚本中,以高精度计算浮点,并以低精度存储在shell变量值中,bash,shell,Bash,Shell,在我的一个脚本中,我从另一个变量文件夹计算一个变量mflow。必须以高精度执行计算,但最终结果必须截断为一个有效数字。目前我正在这样做: #!/bin/bash for folder in 100 115 116 117; do temp=$(bc <<< "scale=20;$folder/100*14.8") mflow=$(bc <<< "scale=1;$temp*1/1") echo $mflow done exi

在我的一个脚本中,我从另一个变量
文件夹
计算一个变量
mflow
。必须以高精度执行计算,但最终结果必须截断为一个有效数字。目前我正在这样做:

#!/bin/bash


for folder in 100 115 116 117; do

    temp=$(bc <<< "scale=20;$folder/100*14.8")
    mflow=$(bc <<< "scale=1;$temp*1/1")

    echo $mflow

done

exit 0

只需在脚本中尝试该修改,看看会发生什么(mflow的最后三个值变为相等,这会在脚本工作流中产生问题)。

您可以使用awk进行计算和输出格式设置:

for folder in 100 115 116 117; do
        awk -v f="$folder" 'BEGIN{printf "%.1f\n", f/100*14.8}'
done
因此,它给出:

14.8
17.0
17.2
17.3
如果要打印更精确的结果,可以将
%.1f
更改为
%.20f
,然后:

14.80000000000000071054
17.01999999999999957367
17.16799999999999926104
17.31599999999999894840
注: 如果您选择了
bc
,您应该知道此“功能”:


它将为您提供
17.1
,而不是
17.2
。我希望您在选择
bc
作为您的工具之前就知道这一点。

据我所知
$(bc@Dziugas,不,这不是一个好主意。我想以指定的精度四舍五入到最接近的fp,而不仅仅是截断。换句话说,如果我有17.5757,我需要17.6,而不是17.5。事实上我误解了你的要求。我想从否决票中学习……否决票可以留下一些评论吗?谢谢,我测试了它,它可以工作。我已经修改了第二行是
mflow=$(awk-v f=“$folder”'BEGIN{printf”%.1f\n,f/100*14.8}')
,因为我需要将计算结果存储在变量中,但除此之外,代码工作正常。
14.8
17.0
17.2
17.3
14.80000000000000071054
17.01999999999999957367
17.16799999999999926104
17.31599999999999894840
kent$  echo "scale=1;17.17777/1"|bc  
17.1