我想在awk
中使用整数除法分割两个数字,即截断结果。例如
k = 3 / 2
print k
应打印1
根据the manual,
司;因为awk中的所有数字都是浮点数,结果是 没有四舍五入为整数
是否有解决方法来获取整数值?
原因是我希望得到整数索引[0到num-1]的数组的中间元素。
答案 0 :(得分:30)
使用int
函数获取结果的整数部分,截断为0.这将生成最接近结果的整数,位于结果和0之间。例如,int(3/2)
为1 ,int(-3/2)
为-1。
答案 1 :(得分:7)
安全快速的awk整数除法可以通过以下方式完成:
q=(n-n%d)/d+(n<0)
答案 2 :(得分:5)
在简单的情况下,您可以安全地使用截断为零 1 的int()
:
awk 'BEGIN { print int(3 / 2) }' # prints 1
gawk 'BEGIN { print int(-3 / 2) }' # prints -1; not guaranteed in POSIX awk
请记住,awk总是使用双精度浮点数 2 和浮点算术 3 。获得整数和整数运算的唯一方法是使用外部工具,例如:标准expr
实用程序:
awk 'BEGIN { "expr 3 / 2" | getline result; print result; }' # prints 1
这真是 awk 病房,长,慢,......但安全又便携。
1 在POSIX awk中,仅对正参数保证截断为零: int(x) - 将截断的参数返回到整数。当x> 0时,截断应朝向0。 GNU awk(gawk)即使对于负数也使用截断为零: int(x) - 将最接近的整数返回到x,位于x和x之间零并截断为零。例如,int(3)为3,int(3.9)为3,int(-3.9)为-3,int(-3)为-3。
2 在POSIX中,Expressions in awk中的数字表达式被指定为双精度浮点数。
3 所有算术都应遵循ISO C标准规定的浮点运算的语义(参见Concepts Derived from the ISO C Standard)。 - {{3} }
如果您选择使用花车,您应该知道它们的怪癖并准备好发现它们并避免相关的错误。几个可怕的例子:
无法代表的数字:
awk 'BEGIN { x = 0.875; y = 0.425; printf("%0.17g, %0.17g\n", x, y) }'
# prints 0.875, 0.42499999999999999
POSIX awk: Arithmetic functions积累:
awk 'BEGIN{s=0; for(i=1;i<=100000;i++)s+=0.3; printf("%.10f, %d\n",s,int(s))}'
# prints 29999.9999999506, 29999
舍入错误破坏了比较:
awk 'BEGIN { print (0.1 + 12.2 == 12.3) }' # prints 0
精度随着幅度的增加而减小,导致无限循环:
awk 'BEGIN { for (i=10^16; i<10^16+5; i++) printf("%d\n", i) }'
# prints 10000000000000000 infinitely many times
详细了解花车如何工作:
Stack Overflow标签Round-off errors wiki
维基百科文章floating-point
Floating point - 包含有关具体实施和一般知识的信息