awk在处理浮点数加减时默认是按double-float来处理,一般的处理对精度要求没有那么高,因此通常用awk不会踩到精度的坑,当你对精度的要求要达到小数点后面6位以上时,就要注意精度的问题了。
1、精度问题举例
小数点后面6位小数,输出6位正常
$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.6f\n",sum)}'
57760731.179959
输出8位也正常
$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.8f\n",sum)}'
57760731.17995900
注意,输出9位就有误差了
$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.9f\n",sum)}'
57760731.179958999
输出10位的误差更大
$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.10f\n",sum)}'
57760731.1799589992
2、精度误差的原因和解决方案
awk的默认精度范围是53bit,也就是双精度的范围内,因此在做高精度数值计算时,一定要注意浮点数的精度要求。
要提高精度,可以通过修改PREC内置变量来解决,参考文档:15.4.4 Setting the Precision
$ echo 57760731.179959 | awk -M -v PREC=100 -v CONVFMT=%.30g '{sum+=$1}END{printf("%.10f\n",sum)}'
57760731.1799590000