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

时间:2016-05-19 13:17:03

标签: bash shell

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

#!/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=$(bc <<< "scale=1;$temp*1/1")

似乎有点浪费。有没有办法以高精度执行中间计算,并将结果分配给具有所选(较低)精度的mflow?当然,我不想过多地牺牲脚本的可读性。因此,请问,不是一个看起来像sed&#34;来自地狱的一行的解决方案&#34; ;)(好吧,我猜sed无法用于此,但你得到了我的观点。)

如果有人想知道为什么我不写

,PS会发生错误
mflow=$(bc <<< "scale=1;$folder/100*14.8")

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

1 个答案:

答案 0 :(得分:1)

您可以使用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,你应该知道这个&#34;功能&#34;:

kent$  echo "scale=1;17.17777/1"|bc  
17.1

它会为您17.1而不是17.2。我希望您在选择bc作为工具之前了解这一点。