首页
搜索 搜索
当前位置:关注 > 正文

天天微动态丨awk判断整除(包含小数和负数)

2023-04-26 20:42:21 博客园


(资料图片仅供参考)

awk判断整除常用的方法是用内置的int或者求余数的算符%

被整数整除

输出0-100之间能被9整除的整数使用 num/9==int(num/9) 的判断方法可以很好实现。

awk "BEGIN{    for (i=0; i<100; i++) {    if (i/9==int(i/9)) print i    }}" | cat

或者使用 num%9==0 也可以轻松实现

awk "BEGIN{    for (i=0; i<100; i++) {    if (i%9==0) print i    }}" | cat
被小数整除常犯的错误

但是,如果输出数列0.01, 0.02, 0.03, ... 1.00中能够被0.09整除的数字时,使用num/0.09==int(num/0.09)就行不通了,因为会遗漏很多数字。使用命令awk "BEGIN{for (i=0; i<1; i+=0.01) print i,i/0.09-int(i/0.09)}" 的输出部分结果是:

0 0 00.01 0.01 0.1111110.02 0.02 0.222222...0.16 0.07 0.7777780.17 0.08 0.8888890.18 2.77556e-17 4.44089e-160.19 0.01 0.111111...0.88 0.07 0.7777780.89 0.08 0.8888890.9 6.10623e-16 7.10543e-150.91 0.01 0.1111110.92 0.02 0.2222220.93 0.03 0.3333330.94 0.04 0.4444440.95 0.05 0.5555560.96 0.06 0.6666670.97 0.07 0.7777780.98 0.08 0.8888890.99 6.93889e-16 7.10543e-15

其中0.18,0.27都不是0,而是一个很小的数字,所以上面的方法只适用于整数的情况。

正确方法

输出数列 3.0, 3.1, 3.2, 3.3, ... 5.0 中的可以被0.8整除的数字(正确答案是3.2, 4.0和4.8)命令awk "BEGIN{for (i=3; i<5; i+=0.1) print i,i%0.8,i/0.8-int(i/0.8)}"输出的结果是

3 0.6 0.753.1 0.7 0.8753.2 0 0             !结果正确3.3 0.1 0.1253.4 0.2 0.253.5 0.3 0.3753.6 0.4 0.53.7 0.5 0.6253.8 0.6 0.753.9 0.7 0.8754 6.66134e-16 8.88178e-16 !结果错误4.1 0.1 0.1254.2 0.2 0.254.3 0.3 0.3754.4 0.4 0.54.5 0.5 0.6254.6 0.6 0.754.7 0.7 0.8754.8 0.8 1          !结果错误4.9 0.1 0.1255 0.2 0.25

所以正确的方法是使用以下命令:

awk "BEGIN{    for (i=3; i<5; i+=0.1) {    if (i/0.8-int(i/0.8)<0.001 || i/0.8-int(i/0.8)>0.999) print i    }}" | cat

或者使用以下命令:

awk "BEGIN{    for (i=3; i<5; i+=0.1) {    if (i%0.8<0.001 || i%0.8>0.799) print i    }}" | cat
包含负数时

如果包含负数,那么上面的方法也有问题。最终稳妥的判断方法应该是:num/0.5-int(num/0.5)<-0.999 || ( num/0.5-int(num/0.5)>-0.001 && num/0.5-int(num/0.5)<0.001 ) || num/0.5-int(num/0.5)>0.999简短的写作:zc=num/0.5-int(num/0.5)if (zc<-0.999 || (zc>-0.001 && zc<0.001) || zc>0.999)例如输出-5到5之间能被0.5整除的小数

awk "BEGIN{    for (i=-5; i<5; i+=0.1) {        zc=i/0.5-int(i/0.5);         if (zc<-0.999 || (zc>-0.001 && zc<0.001) || zc>0.999) printf("%4.1f\n",i)    }}" | cat