我有一个bash脚本,用awk从较大的数字中减去0.0001。当数字超过四位小数时,它不起作用。
它将这些参数用于awk ......
balance=$(awk -vn1="$balance" -vn2="0.0001" 'BEGIN{print (n1-n2) }')
如果$balance
等于1.44189949
,则该数字最终为1.4418
,且需要为1.44179949
,因此我做错了。
我以前从未处理过bash中的浮点数。
答案 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,会被重定向到命令。