如何找最接近目标值的函数?

蒋春阳
蒋春阳

创作者俱乐部成员

背景:在一列杂乱无章的数列中,查找距离给定目标值最接近的数值?如图所示:

A列

B列

1

数列

-12

2

201

3

589

4

12

5

20

6

21

7

40

8

48

9

56

10

72

11

102

12

109

13

96

14

目标值:

45

15

最接近目标的数值:

分步骤解析:

遇到这个问题,我的常规情况思路会是添加辅助列,取数列与目标值的差值,找到对应差值中绝对值最小的那个,那么最接近目标的数值就找到啦~~

当然,没毛病,这个思路是对的,只不过需要添加辅助列,且一旦目标值发生变化,还需要重新进行肉眼识别查找,费时费力,还存在出错的风险;那么,咱们还是这个思路,用数组来试一试呢?

第一步:取数列中各数据距离目标值的长度,使用数学中的绝对值函数:ABS(B1:B13,$B$14)其中,目标值位置固定,采用绝对引用。

第二步:查找距离目标值的最小长度是多少,这个就是大家熟知的最小值函数啦:MIN(ABS(B1:B13,$B$14))。

第三步:筛选距离目标值长度最小的数据,当然非FILTER函数莫属啦,即在B1:B13数列中查找,FILITER(B1:B13,ABS(B1:B13,$B$14)=MIN(ABS(B1:B13,$B$14)))。

这时候,随便改目标值,最接近目标的数值将会随之变化,是不是很便利呢?当然,如果数列有增加或减少,仅需要随之改变公式中数列的位置即可。

注意:数据中含有数组,记得用CTRL+SHIFT+ENTER三键组合运行哦~~

吉林省
浏览 2255
收藏
9
分享
9 +1
11
+1
全部评论 11
 
月桂醇
=LOOKUP(,0/FREQUENCY(0,(B1:B13-B14)^2),B1:B13)
· 河北省
回复
蒋春阳
蒋春阳

创作者俱乐部成员

感谢分享,看似更简洁,我要去好好消化一下下👏👏
· 吉林省
回复
 
张俊
张俊

WPS函数专家

我是用这样的公式:=IF(C1>=0,MAX((MIN(ABS(A1:A11-C1))=(A1:A11-C1))*A1:A11),MIN((MIN(ABS(A1:A11-C1))=(A1:A11-C1))*A1:A11)) 公式说明:先通过A1:A11单元格区域的值减去目标值C1,最后通过ABS函数求绝对值中的,然后再通过MIN函数求出最小值,也就是最接近目标值的;然后再判断与前面的计算式那个相等,最后再乘以A1:A11的区域,计算值满足条件的值;这时还需要判断目标值是大于等于0还是小于0,如果大于等于0则用MAX来计算(如图1),如果小于0,则需要用MIN来计算(如图2),所以外层就需要嵌套一个IF函数来判断(如图3),也感谢蒋老师的分享。
· 上海
回复
蒋春阳
蒋春阳

创作者俱乐部成员

又学到一种思路,感谢张老师分享!
· 吉林省
1
回复
 
拾光漫行
拾光漫行

WPS函数专家

我觉得最后加个textjoin为好,万一有两个距离45相同近的呢 比如44和46
· 重庆
回复
蒋春阳
蒋春阳

创作者俱乐部成员

稍后我试试,谢谢!
· 吉林省
回复
 
蒋春阳
蒋春阳

创作者俱乐部成员

抱歉,应该是ABS(B1:B13-$B$14)
· 吉林省
1
回复
 
姚妮 郑州轻工业大学
=INDEX(B1:B13,MATCH(SMALL(ABS(B14-B1:B13),1),ABS(B14-B1:B13),0)) 按CTRL+SHIFT+ENTER三键
· 河南省
2
回复
蒋春阳
蒋春阳

创作者俱乐部成员

谢谢姚老师,又可以学习一种新思路~
· 吉林省
回复
 
邓华
邓华

WPS函数专家

总结的很好
· 广东省
回复
蒋春阳
蒋春阳

创作者俱乐部成员

谢谢邓老师鼓励,继续学习,每天进步一点点~
· 吉林省
回复