awk判断整除(包含小数和负数) - Philbert
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.
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__
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK