awk实战6-awk浮点数精度的坑

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

你可能感兴趣的:(awk实战6-awk浮点数精度的坑)