使用awk减去浮点数

时间:2014-12-13 19:33:29

标签: bash awk floating-point

我有一个bash脚本,用awk从较大的数字中减去0.0001。当数字超过四位小数时,它不起作用。

它将这些参数用于awk ......

balance=$(awk -vn1="$balance" -vn2="0.0001" 'BEGIN{print (n1-n2) }')

如果$balance等于1.44189949,则该数字最终为1.4418,且需要为1.44179949,因此我做错了。

我以前从未处理过bash中的浮点数。

4 个答案:

答案 0 :(得分:4)

使用printf并使用"%.8f\n"更改awk的默认舍入行为,以获得八个舍入数字。

awk  -vn1="1.44189949" -vn2="0.0001" 'BEGIN{printf ("%.8f\n",n1-n2)}'

答案 1 :(得分:2)

只需设置你想要的OFMT并打印结果,不需要printf:

$ awk -v n1="1.44189949" -v n2="0.0001" -v OFMT="%.8f" 'BEGIN{print n1-n2}'
1.44179949

答案 2 :(得分:1)

最好使用bc而不是awk来进行此计算。

balance=$(echo $balance-0.0001 | /usr/bin/bc)

问题的最佳解决方案通常是最简单的解决方案。

答案 3 :(得分:1)

如果您愿意,您可以像我在以下bash脚本中所做的那样免除awk

balance=1.44189949
printf "%.8f\n" $(bc -l <<< "$balance - 0.0001")

此代码使用最擅长处理浮点值的bc。然后printf负责舍入它,结果是:

1.44179949

请注意,bc的输入是here string,会被重定向到命令。