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

博客 动态
0 271
羽尘
羽尘 2023-04-26 20:27:38
悬赏:0 积分 收藏

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.1f\n",i)
    }}' | cat
posted @ 2023-04-26 20:11  Philbert  阅读(0)  评论(0编辑  收藏  举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员