awk判断整除(包含小数和负数)

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 0 0.01 0.01 0.111111 0.02 0.02 0.222222 ... 0.16 0.07 0.777778 0.17 0.08 0.888889 0.18 2.77556e-17 4.44089e-16 0.19 0.01 0.111111 ... 0.88 0.07 0.777778 0.89 0.08 0.888889 0.9 6.10623e-16 7.10543e-15 0.91 0.01 0.111111 0.92 0.02 0.222222 0.93 0.03 0.333333 0.94 0.04 0.444444 0.95 0.05 0.555556 0.96 0.06 0.666667 0.97 0.07 0.777778 0.98 0.08 0.888889 0.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.75 3.1 0.7 0.875 3.2 0 0             !结果正确 3.3 0.1 0.125 3.4 0.2 0.25 3.5 0.3 0.375 3.6 0.4 0.5 3.7 0.5 0.625 3.8 0.6 0.75 3.9 0.7 0.875 4 6.66134e-16 8.88178e-16 !结果错误 4.1 0.1 0.125 4.2 0.2 0.25 4.3 0.3 0.375 4.4 0.4 0.5 4.5 0.5 0.625 4.6 0.6 0.75 4.7 0.7 0.875 4.8 0.8 1          !结果错误 4.9 0.1 0.125 5 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.1fn",i)     }}' | cat 

发表评论

评论已关闭。

相关文章