我有这个问题,
awk 'BEGIN{ x = 0.703125; p = x/2; print p }' somefile
,输出为0.351562.
但缺少十进制数。它应该是0.3515625
那么有没有办法改进除法以将所有小数存储到变量中而不仅仅是打印?所以p确实保持值0.3515625
答案 0 :(得分:1)
这是因为CONVFMT
(较新版本的awk
)的内置值,而OFMT
只有6位精度。您需要通过修改要与print
一起使用的变量或使用printf
所需的精度来使其与众不同。
CONVFMT's
默认值为"%.6g"
,创建最多六位有效数字的值。对于某些应用程序,您可能希望更改它以指定更高的精度。在大多数现代机器上,17位数通常足以准确捕获浮点数的值。在POSIX标准之前,
awk
使用OFMT
的值将数字转换为字符串。OFMT
指定使用print打印数字时要使用的输出格式。引入CONVFMT
是为了将转换的语义与打印的语义分开。CONVFMT
和OFMT
都具有相同的默认值:"%.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; }'