awk中的整数除法

use*_*001 19 awk integer division

我想awk使用整数除法将两个数字分开,即截断结果.例如

k = 3 / 2
print k
Run Code Online (Sandbox Code Playgroud)

应该打印 1

根据手册,

师; 因为awk中的所有数字都是浮点数,结果不会舍入为整数

有没有解决方法来获取整数值?

原因是我想得到一个带有整数索引[0到num-1] 的数组的中间元素.

Gil*_*not 33

使用该int函数获取结果的整数部分,将其截断为0.这将生成与结果最接近的整数,位于结果和0之间.例如,int(3/2)为1,int(-3/2)为-1.

来源:AWK手册 - 数字函数


Pal*_*lec 7

在简单的情况下,您可以安全地使用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病房,长期,缓慢的,......但安全和便于携带.


1POSIX 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:算术函数


如果您选择使用浮动,您应该知道他们的怪癖并准备发现它们并避免相关的错误.几个可怕的例子:

详细了解浮点数的工作原理:

  1. Stack Overflow标签维基

  2. 维基百科文章浮点

  3. GNU awk任意精度算术 - 包含有关具体实现和一般知识的信息


小智 7

安全快速的awk整数除法可以通过以下方式完成:

q=(n-n%d)/d+(n<0)
Run Code Online (Sandbox Code Playgroud)