Gil*_*not 33
使用该int函数获取结果的整数部分,将其截断为0.这将生成与结果最接近的整数,位于结果和0之间.例如,int(3/2)为1,int(-3/2)为-1.
来源:AWK手册 - 数字函数
在简单的情况下,您可以安全地使用int()哪个截断为零1:
awk 'BEGIN { print int(3 / 2) }' # prints 1
gawk 'BEGIN { print int(-3 / 2) }' # prints -1; not guaranteed in POSIX awk
Run Code Online (Sandbox Code Playgroud)
请记住,awk总是使用双精度浮点数2和浮点运算3.获得整数和整数运算的唯一方法是使用外部工具,例如标准expr实用程序:
awk 'BEGIN { "expr 3 / 2" | getline result; print result; }' # prints 1
Run Code Online (Sandbox Code Playgroud)
这真是AWK病房,长期,缓慢的,......但安全和便于携带.
1在POSIX awk中,仅对正参数保证截断为零:int(x) - 将截断的参数返回到整数.当x> 0时,截断应朝向0. 即使对于负数,GNU awk(gawk)也使用截断为零:int(x) - 将最接近的整数返回到x,位于x和0之间并截断为零.例如,int(3)为3,int(3.9)为3,int(-3.9)为-3,int(-3)为-3.
2数字表达式在POSIX 中的awk中的表达式中指定为双精度浮点数.
3 所有算术都应遵循ISO C标准规定的浮点运算的语义(参见ISO C标准中的概念).- POSIX awk:算术函数
如果您选择使用浮动,您应该知道他们的怪癖并准备发现它们并避免相关的错误.几个可怕的例子:
不可代表的数字:
awk 'BEGIN { x = 0.875; y = 0.425; printf("%0.17g, %0.17g\n", x, y) }'
# prints 0.875, 0.42499999999999999
Run Code Online (Sandbox Code Playgroud)舍入错误累积:
awk 'BEGIN{s=0; for(i=1;i<=100000;i++)s+=0.3; printf("%.10f, %d\n",s,int(s))}'
# prints 29999.9999999506, 29999
Run Code Online (Sandbox Code Playgroud)舍入错误破坏比较:
awk 'BEGIN { print (0.1 + 12.2 == 12.3) }' # prints 0
Run Code Online (Sandbox Code Playgroud)精度随着幅度减小,导致无限循环:
awk 'BEGIN { for (i=10^16; i<10^16+5; i++) printf("%d\n", i) }'
# prints 10000000000000000 infinitely many times
Run Code Online (Sandbox Code Playgroud)详细了解浮点数的工作原理:
Stack Overflow标签浮点维基
维基百科文章浮点
GNU awk任意精度算术 - 包含有关具体实现和一般知识的信息