首页 > 其他分享 >awk判断整除(包含小数和负数)

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

时间:2023-04-26 20:23:46浏览次数:28  
标签:BEGIN int 0.5 num 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

标签:BEGIN,int,0.5,num,awk,整除,小数
From: https://www.cnblogs.com/liangxuran/p/17357146.html

相关文章

  • C# 小数转百分比以及小数转字符串精确小数点
    模拟游戏中相乘减伤计算staticvoidTest(){Calc(newdouble[]{0.1,0.3,0.2,0.17,0.5});}staticvoidCalc(double[]arr){doubletotal=1;foreach(vardinarr){total*=(1-d......
  • 集成Hawk 2.0.1,遇到gson冲突的解决办法
    这个错误提示是因为在两个不同的库中都包含了相同的类(com.google.gson.ExclusionStrategy)。解决方法如下:删掉其中一个库。如果你的项目中只需要其中一个库,那么可以直接删除另一个库,或者将其从依赖中移除。升级库版本。如果两个库都是必需的,那么可以尝试升级其中一个库的版本......
  • JS-数学表达式正则表达式支持(包含希腊字母、小数点等)
    //技术状况规则/**evt:{target:{value:''}},row:{"propName":"""propRule":""}*/functioncheckRule(evt,row,propName,propRule){//匹配a=5,a>5,a<5,a≤6,a≥5等varrule1=/[ΆΈ-ώa-zA-z]+([1-9]......
  • 直播app开发搭建,EditText保留小数位数的问题
    直播app开发搭建,EditText保留小数位数的问题 packagecom.shentaiwang.jsz.savepatient.util;importandroid.text.Editable;importandroid.text.TextWatcher;importandroid.widget.EditText;/***Createdbyjszon2017/7/22.*保留小数位数*/publicclassRetainDecimal{......
  • linux awk
    1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。2.三种方式调用awk1)awk[opion]'awk_script'input_file1[input_file2...]awk的常用选项option有:①-Ffs:使......
  • Java 计算两个 LocalDateTime 类型的变量之间差的小时数,保留4位小数
    为了计算两个LocalDateTime对象之间相差的小时数,并精确到小数点后4位,您可以使用Duration类。以下是一个示例:importjava.time.LocalDateTime;importjava.time.Duration;publicclassMain{publicstaticvoidmain(String[]args){LocalDateTimea=Loc......
  • eeprom保存小数并且读出
    使用野火的eeprom驱动union{floatf;charb[10];}value;//value.f=0.248745;value.f=-248.7921;I2C_EE_BufferWrite(value.b,1,sizeof(value.b));//从地址1开始写入数据union{floatd;chark[10];}value1;......
  • element-plus 输入框只能输入数字和小数
    只能输入数字:<el-inputoninput="value=value.replace(/[^0-9]/g,'')"placeholder="请输入">只能输入数字和两位小数(多余小数点会去掉)<el-inputoninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replac......
  • js千分位带小数显示处理
    //参照Elmenentui statistic组件 functiondispose(value='',precision=null,groupSeparator='',rate=1000){   if(!isNumber(value))returnfalse;   let[integer,decimal]=String(value).split('.');   if(pre......
  • 二分查找:剑指 Offer 11. 旋转数组的最小数字
    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]为[1,2,3,4,5]的一次旋转,该数组的最......