4

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

 1 year ago
source link: https://www.cnblogs.com/liangxuran/p/17357146.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

__EOF__

本文作者: Liang Xuran 本文链接: https://www.cnblogs.com/liangxuran/p/17357146.html 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK