计量论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖

[讨论] 保留位数EXCEL实现

[复制链接]
 楼主| wangyiyong7703 发表于 2023-10-8 19:56:46 | 显示全部楼层
这个是150的修约
微信图片_20231008195555.png
微信图片_20231008195603.png
 楼主| wangyiyong7703 发表于 2023-10-8 19:58:34 | 显示全部楼层
上面是vb做的,容易实现
 楼主| wangyiyong7703 发表于 2023-10-8 20:13:27 | 显示全部楼层
路云 发表于 2023-10-8 19:35
打赌就没有意思了。我只是说“恐怕就不是VBA宏能够解决的了”。EXCEL的数值处理范围区间大小是有限的。您 ...

1.POWER()这个函数是有点问题,我的公式目前的缺陷就是它带来的。
2.暂时没有想到更好的办法,如果你有好的算法,欢迎提出来。
3.用他来定位小数点确实是个好办法,但缺陷是数位过大的时候问题就来了。如果只是解决数位小的问题,这个不在话下。
4.关键要提出一些好的反例,利于优化公式,给网友们提供方便实用的公式,

评分

参与人数 1威望 +2 收起 理由
admin + 2 赞一个!

查看全部评分

 楼主| wangyiyong7703 发表于 2023-10-10 08:38:50 | 显示全部楼层
避开格式设置问题公式如下:f(A1,B1)为网上或文献中提供的各种数值计算处理的四舍六入五成双公式,text(f(A1,B1),"0." & rept("0",B1).这样不用格式设置。A1为待修约全数值,B1为修约要求的保留小数点位数

补充内容 (2023-10-10 16:33):
text(f(A1,B1),"0." & rept("0",B1))
路云 发表于 2023-10-13 23:58:41 | 显示全部楼层
wangyiyong7703 发表于 2023-10-8 19:52
1.麻烦您举一些实质性的问题进行讨论,这样很累,没有意义,之前您找到的很多有意义的反例很好;
2.纯数 ...

2.纯数字文本也可以参与其它计算,强制进行转换。这里解决的是尾数补0的情况,用文本表示是不得已的事。

3.修约后尾数0后,系统自动去除,您的自定义函数是一个致命的问题。如果靠设置去解决,那您的公式确实看起来很好。

5.你用设置格式解决尾数补0问题,确实不是很高端,我也是想避开。其实有很多内建函数配合格式设置可以做到,完全不用VB,这个早就实现了。

EXCEL中“设置单元格格式”功能模块,就是为了解决各种数据格式的显示问题,运用公式、函数的目的,是解决“四舍六入五留双”的问题。修约后的尾数补0,不是修约的问题,而是显示格式的问题。所有的格式显示问题,都可以用文本处理的方式去解决,那还需要“设置单元格格式”这一模块吗?有现成的、简单的、适用的工具你不用,非要用文本处理的方式去解决,那是你的自由。

6.发挥内建函数作用,不靠其他方法是我追求的。因为您用vb做的自定义函数没多大意思,我实不屑取,避开vb,才是我们想要的。用vb超百位的修约我也可以做到,早就做到了。

你可以有你的追求,你认为自定义函数没多大意思那也是你个人的看法,我只是提供一种思路与方法,供您参考,我又没有逼你一定要用。我不知道研究超百位的修约又有何意思,难道我们要去研究圆周率?现实当中超过10位小数的修约应用有多少?

POWER()函数只是解决实数的乘幂问题,解决不了修约后的尾数补0问题。自定义函数已经解决了修约的问题,无需用到这个函数。

避开格式设置问题公式如下:f(A1B1)为网上或文献中提供的各种数值计算处理的四舍六入五成双公式,Text(f(A1,B1),"0." & rept("0",B1).这样不用格式设置。A1为待修约全数值,B1为修约要求的保留小数点位数

所谓公式f(A1,B1),我也在网上找了很多,但最简单易用的,就是我7楼提供的这个。用这个自定义函数,TEXT()公式就不灵了。

您的公式最大的问题是改变了数值的性质,将其变成了“文本”,解决不了带符号显示的问题,也避免不了37截图所示的非数值问题。

 楼主| wangyiyong7703 发表于 2023-10-14 10:13:33 | 显示全部楼层
路云 发表于 2023-10-13 23:58
2.纯数字文本也可以参与其它计算,强制进行转换。这里解决的是尾数补0的情况,用文本表示是不得已的事。 ...

1.=TEXT(yround(A7,B7),"0."&REPT("0",B7)……原来显示0.1,现在为0.100.用您的公式很好用呀,配合我提供的 TEXT(...rept..)公式,只是用了VB也要用公式设置,觉得太LOW了。
2.用vb我早就实现了上百位的修约,还不用格式设置,单元格有255个字符显示,说明我可以修约2百多位数是没有问题的。
3.用简单的公式无法实现超多位数的修约,不然没有必要在您的面前弄斧头了,那不是丢人现眼,没有必要发这个贴了。
4.文献和网上好多公式没有解决尾数为0自动不显示,另一个超大位数的问题。我希望您也来提供一些好的算法。
5.尾数为0自动舍去,补零是须要的,文本是解决方法之一,用text也相当于手动设置改为公式设置,充分利用rept这个函数后,可以自动设置了。您用手动格式设置也可以。
6.因为之前很多有很多公式是用的数值处理,数值处理天然会带有位数限制,修约结果受到影响。所以想到将数字进行文本方式处理,vb设计结果显示是成功的。但用内建函数没有找到很好的办法,POWER相对来说表现效果好一点,但还是只能到15位,其它的基本只能到10位。当然目前只是想到用分段处理算法,但效果可能有限,只能到30位,而且公式很长。目前没有好的算法。
微信图片_20231014095513.png
 楼主| wangyiyong7703 发表于 2023-10-14 10:23:38 | 显示全部楼层
本帖最后由 wangyiyong7703 于 2023-10-14 10:29 编辑
路云 发表于 2023-10-13 23:58
2.纯数字文本也可以参与其它计算,强制进行转换。这里解决的是尾数补0的情况,用文本表示是不得已的事。 ...


1.至于您说的符号显示问题,我觉不是个问题,就是正号显示问题,负数修约到我这不成为问题,您用负数算一下就可以了。
2.您要举一个实例,哪个地方要显示正号;我是没有见过必须要在修约之后显示正号的;您自己的公式也没有正号啊,为什么要求我的公式显示正号。
3.我之所以不想理会正号问题,是觉得这个问题提的有点怪。一般人不会提出这种问题,到您这里成为问题???!!!
4.if(A1>0,"+" & f(A1,b1),f(A1,b1))如果你须要这个的话,我给提供您这个方法f(A1,b1)为无法显示正号的公式。这种问题太LOW。
=IF(A15*1>0,"+" & IF(OR(AND(ISEVEN(MID(A15,FIND(".",A15)+B15,1)*1),MID(A15,FIND(".",A15)+B15+1,1)="5",IFERROR(RIGHT(A15,LEN(A15)-FIND(".",A15)-B15-1)*1,0)=0),MID(A15,FIND(".",A15)+B15+1,1)*1<5),LEFT(A15,FIND(".",A15,1)+B15),IF(IFERROR(FIND(".",LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15),1),0)=0,LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15)&"."&REPT("0",B15),LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15)&REPT("0",B15-(LEN(LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15))-IFERROR(FIND(".",LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15),1),0))))),IF(OR(AND(ISEVEN(MID(A15,FIND(".",A15)+B15,1)*1),MID(A15,FIND(".",A15)+B15+1,1)="5",IFERROR(RIGHT(A15,LEN(A15)-FIND(".",A15)-B15-1)*1,0)=0),MID(A15,FIND(".",A15)+B15+1,1)*1<5),LEFT(A15,FIND(".",A15,1)+B15),IF(IFERROR(FIND(".",LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15),1),0)=0,LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15)&"."&REPT("0",B15),LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15)&REPT("0",B15-(LEN(LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15))-IFERROR(FIND(".",LEFT(A15,FIND(".",A15,1)*1+B15)*1+IF(A15*1<0,-1,1)/POWER(10,B15),1),0))))))
微信图片_20231014102913.png
 楼主| wangyiyong7703 发表于 2023-10-14 10:42:35 | 显示全部楼层
1.至于您提的非数值问题,那这个问题你的公式也做到了吗?把一个参有字母数字串去修约,这个反例够可以了的。
2.A1里面输入的待修约全数值是公式算出来的结果,比如平均值公式什么的,搞检测的公式复杂一点,怎么会含有字母,除非您跳出了十进制。
3.A1里面手动输入才会有带字母的全数值。那是输入的问题。要解决的是输入规范的问题。不是这里要解决的。
4.如果您提出的反例只能到这个层次,那说明我的公式在处理数值上是没有大的漏洞了。
5.之前其它贴子里面有人也提出了输入问题,经过多次运算之后 的浮点问题,遗传到我的公式里面,但我作出了合理解决。输入阶段的问题,在输入阶段解决。不能要求修约公式是万能的。当然用vb可以解决有效性输入的问题,但这个效率低了一点。在其它地方解决输入问题可能好一点。
路云 发表于 2023-10-15 01:39:21 | 显示全部楼层
本帖最后由 路云 于 2023-10-15 13:53 编辑
wangyiyong7703 发表于 2023-10-14 10:13
1.=TEXT(yround(A7,B7),"0."&REPT("0",B7)……原来显示0.1,现在为0.100.用您的公式很好用呀,配合我提供 ...

1.=TEXT(yround(A7,B7),"0."&REPT("0",B7)……原来显示0.1,现在为0.100.用您的公式很好用呀,配合我提供的 TEXT(...rept..)公式,只是用了VB也要用公式设置,觉得太LOW了。

不是公式设置,而是格式设置,不要把概念给搞混了。

2.用vb我早就实现了上百位的修约,还不用格式设置,单元格有255个字符显示,说明我可以修约2百多位数是没有问题的。

3.用简单的公式无法实现超多位数的修约,不然没有必要在您的面前弄斧头了,那不是丢人现眼,没有必要发这个贴了。

4.文献和网上好多公式没有解决尾数为0自动不显示,另一个超大位数的问题。我希望您也来提供一些好的算法。

我早就说了,实际应用中,我几十年也没有遇到过超多位数的修约案例与需求。不想在已经能够满足实际需求的情况下,再去研究这种不切实际的问题。位数0自动不显示,本就是单元格格式没有设置所致。有了简单易用的单元格格式设置功能模块,我为什么还要去动这个脑筋呢?假如我现在要改成百分比的格式显示,你是不是要重新修改公式呀?

2.您要举一个实例,哪个地方要显示正号;我是没有见过必须要在修约之后显示正号的;您自己的公式也没有正号啊,为什么要求我的公式显示正号。

3.我之所以不想理会正号问题,是觉得这个问题提的有点怪。一般人不会提出这种问题,到您这里成为问题???!!!

我33楼的实际案例,“示值误差”的计算,其最终的修约结果,不就是要求除0误差外,必须带正负号吗。

1.至于您提的非数值问题,那这个问题你的公式也做到了吗?把一个参有字母数字串去修约,这个反例够可以了的。

你的拟修约数是“文本”,误敲入字母或其他符号完全是有可能的。

2.A1里面输入的待修约全数值是公式算出来的结果,比如平均值公式什么的,搞检测的公式复杂一点,怎么会含有字母,除非您跳出了十进制。

既然是公式算出来的,那么计算结果的小数位数,完全有可能会少于你需要保留的小数位数。

3.A1里面手动输入才会有带字母的全数值。那是输入的问题。要解决的是输入规范的问题。不是这里要解决的。

你的单元格格式就是“文本”,误操作完全是有可能的,而且输入的其他字符完全符合“文本”的要求,是你没有对输入的数据进行“有效性控制”、拦截。

另外强调一点,实际应用中,第二列的“保留小数位数”,根本就无需在原始记录的表格中出现,也无需去输入。相应单元格的数据处理后的最终结果的保留小数位数,应该是在编制“原始记录表”模板时,就已经是确定,可以固化的。

a.png



 楼主| wangyiyong7703 发表于 2023-10-15 08:09:21 | 显示全部楼层
你的反例举得很好啊,之前跟你讲过,后面输入数据处理即可,即对于待修约数有效数字比修约要求的少,包括浮点输入,误输入都可以对其进行过虑,通过加round过滤浮点问题,通过f(x)&"000000"解决待修约位数少的问题。
 楼主| wangyiyong7703 发表于 2023-10-15 08:20:11 | 显示全部楼层
从实际角度讲应尽量减少修约后精度提高的问题,不能拿这个说事。误差确须带正负符号的话,你加我的算法不就可以了。如果把这个算法也加到普通修约公式里面去,那不还要增加一个支链判定是不是误差。搞笑,正确方向提反例好不好
 楼主| wangyiyong7703 发表于 2023-10-15 08:24:45 | 显示全部楼层
增加位数,不用vb,不用手动设置公式是我个人增加难度,不在这里恶心我,好不好,交待多少回了。你要知道excel爱好者有这么一群人就爱干这个事。
 楼主| wangyiyong7703 发表于 2023-10-15 08:28:04 | 显示全部楼层
路云 发表于 2023-10-15 01:39
1.=TEXT(yround(A7,B7),"0."&REPT("0",B7)……原来显示0.1,现在为0.100.用您的公式很好用呀,配合我提供 ...

有质量的反例希望你多提点,重复提有什么意思。提了那么多,还不如别人提的一个浮点问题有质量。
路云 发表于 2023-10-15 14:31:48 | 显示全部楼层

你的反例举得很好啊,之前跟你讲过,后面输入数据处理即可,即对于待修约数有效数字比修约要求的少,包括浮点输入,误输入都可以对其进行过虑,通过加round过滤浮点问题,通过f(x)&"000000"解决待修约位数少的问题。

如果工作表函数ROUND()能够解决问题的话,也就用不着去用VB函数ROUND()去编制自定义函数了。

从实际角度讲应尽量减少修约后精度提高的问题,不能拿这个说事。误差确须带正负符号的话,你加我的算法不就可以了。如果把这个算法也加到普通修约公式里面去,那不还要增加一个支链判定是不是误差。搞笑,正确方向提反例好不好

数据处理的函数公式都一样,仅仅是显示格式(是否带正负号)的要求不同,我为什么要去重新修改函数公式?是否带正负号显示,与数据处理的函数公式没有任何关系。计算过程与步骤完全一致,通过单元格格式设置,你需要显示符号(如“示值误差”)就显示符号,不需要显示符号(如“示值重复性”)就不显示符号。这个信息在编制原始记录模板时,还不知道吗?需要你去另加支链来判定是否需要显示符号吗?

增加位数,不用vb,不用手动设置公式是我个人增加难度,不在这里恶心我,好不好,交待多少回了。你要知道excel爱好者有这么一群人就爱干这个事。

我没有恶心你。追求难度是你的事,我无权干预。提供参考方案是我的事,采不采纳是你的自由,没有人强迫你一定要怎么样。你觉得你的方法好,你就用你的方法好了,有什么好纠结的呢。

你的这种思路和方案,我不是没有研究尝试过,编制的原始记录模板也不下几十上百份。最终的体验感觉是不灵活,通用性差,还需要在表格中输入并不需要在原始记录中出现的“保留小数位数”,以及需要根据不同的显示格式需求来修改公式。我这里只是谈我个人的体验感,不代表其他人的体验感。

有质量的反例希望你多提点,重复提有什么意思。提了那么多,还不如别人提的一个浮点问题有质量。

我不清楚您所说的“质量反例”是啥意思。如果您认为我提出的问题都不是问题,那就只当我没说好了。浮点问题我早就说了,用VBROUND()函数,取代工作表函数ROUND()就可以解决。还要怎么说呢?

 楼主| wangyiyong7703 发表于 2023-10-15 14:49:52 | 显示全部楼层
路云 发表于 2023-10-15 14:31
你的反例举得很好啊,之前跟你讲过,后面输入数据处理即可,即对于待修约数有效数字比修约要求的少,包括浮 ...

这个贴子不欢迎你好不好,不是真心为广大网友考虑,你另开一贴吧,让别人评价你那无敌的修约公式。不要回复了,知趣点
路云 发表于 2023-10-15 15:51:20 | 显示全部楼层

放心好了,不会再回复你了。

我并没有说我的自定义函数无敌,但愿你搭台唱戏能吸引更多的量友,受益你那万能的修约公式。

 楼主| wangyiyong7703 发表于 2023-10-16 13:07:10 | 显示全部楼层
欢迎善意的网友们提出好的意见和建议。多提出在制作模版中遇到的修约公式问题,一起探讨解决方案。公式原创不易,希望得到网友推动进步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|计量论坛 ( 闽ICP备06005787号-1—304所 )
电话:0592-5613810 QQ:473647 微信:gfjlbbs闽公网安备 35020602000072号

GMT+8, 2024-5-5 01:56

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表