使用awk时,由于除法而获得更多小数位

时间:2018-04-25 10:35:10

标签: awk

我有这个问题,

awk 'BEGIN{ x = 0.703125; p = x/2; print p }' somefile

,输出为0.351562.但缺少十进制数。它应该是0.3515625那么有没有办法改进除法以将所有小数存储到变量中而不仅仅是打印?所以p确实保持值0.3515625

1 个答案:

答案 0 :(得分:1)

这是因为CONVFMT(较新版本的awk)的内置值,而OFMT只有6位精度。您需要通过修改要与print一起使用的变量或使用printf所需的精度来使其与众不同。

来自Awk Strings and Numbers

  

CONVFMT's默认值为"%.6g",创建最多六位有效数字的值。对于某些应用程序,您可能希望更改它以指定更高的精度。在大多数现代机器上,17位数通常足以准确捕获浮点数的值。

     

在POSIX标准之前,awk使用OFMT的值将数字转换为字符串。 OFMT指定使用print打印数字时要使用的输出格式。引入CONVFMT是为了将转换的语义与打印的语义分开。 CONVFMTOFMT都具有相同的默认值:"%.6g"。在绝大多数情况下,旧的awk程序不会改变它们的行为。但是,如果必须将新样式程序移植到较早的OFMT实现中,则需要记住awk的这些语义。

awk 'BEGIN{ x = 0.703125; p = x/2; printf "%.7f", p }'

除此之外,OP希望在应使用sprintf的变量中使用此高精度数字

awk 'BEGIN{ x = 0.703125; p = x/2; pcustom=sprintf("%.7f", p) }'

或通过更改GNU Awk 4.1.4上的OFMT变量,

awk 'BEGIN{ OFMT = "%0.7f"; x = 0.703125; p = x/2; print p; }'