计量论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[数据] 四舍六入函数模板

[复制链接]
sunrry 发表于 2021-7-28 09:11:42 | 显示全部楼层 |阅读模式
本人根据四舍六入奇进偶不进原则,利用vba做了个自定义的函数,希望对大家有用。
函数语音是    Round2(被修约数据,小数位数)
例如把3.45修约保留一位小数,就是    =round(3.45,1)
此表格嵌套了vba,所以只能在此表中进行操作。

四舍六入函数模板.zip

11.59 KB, 下载次数: 109, 下载积分: 金币 -1

 楼主| sunrry 发表于 2021-7-28 09:16:21 | 显示全部楼层
此函数利用vba,极大精简了使用函数的复杂计算步骤。同时有别于目前发表论文中的方法(本人已发),能有效去除excel中浮点误差的影响。目前其他方法基本上都是根据小数点后七位数字大小判断进行去除浮点误差,本方法通过强制转换十进制解决浮点误差。
alickglyn 发表于 2021-7-28 15:45:01 | 显示全部楼层
一行excel函数解决,=ROUND(A1,a)-(MOD(A1*10^(a+1),20)=5)*10^(-a),A1是需要修约的数的单元格,a为修约位数。
 楼主| sunrry 发表于 2021-7-29 08:42:22 | 显示全部楼层
alickglyn 发表于 2021-7-28 15:45
一行excel函数解决,=ROUND(A1,a)-(MOD(A1*10^(a+1),20)=5)*10^(-a),A1是需要修约的数的单元格,a为修约位 ...

第一,麻烦,每次都要替换,尤其是有时候公式嵌套公式,就更复杂了
第二,excel小数存在浮点误差影响,这个公式有误判。
第三,你这个负数修约结果是错的
唐家琨少 发表于 2021-7-29 09:15:58 | 显示全部楼层
谢谢楼主的分享,最近也在开始自学用宏,正好用你的来学习下。
vba版的确实好用,不过用宏的话,当表格传到别的电脑很有可能就会失效啊。有很多电脑的excel默认禁用了宏。
 楼主| sunrry 发表于 2021-7-29 11:48:22 | 显示全部楼层
唐家琨少 发表于 2021-7-29 09:15
谢谢楼主的分享,最近也在开始自学用宏,正好用你的来学习下。
vba版的确实好用,不过用宏的话,当表格传到 ...

取消禁止就可以用了。
乌拉辣拉 发表于 2021-7-29 13:41:15 | 显示全部楼层
学习一下,很有帮助
 楼主| sunrry 发表于 2021-7-30 12:32:35 | 显示全部楼层
大家有方便实用的工具也可以互相交流一下啊
连长 发表于 2021-7-30 15:05:15 | 显示全部楼层
修约间隔为10,你这函数就扒瞎了
 楼主| sunrry 发表于 2021-8-10 12:12:51 | 显示全部楼层
连长 发表于 2021-7-30 15:05
修约间隔为10,你这函数就扒瞎了

修约间隔为5和10的可以再搞个函数,或者直接拿这个数除相应的数以后修约再乘回来
 楼主| sunrry 发表于 2021-8-10 12:13:12 | 显示全部楼层
excel里面的修约函数也没有2间隔、5间隔之类的
连长 发表于 2021-8-11 08:47:36 | 显示全部楼层
可以按照规则,结合excel的数据处理,自己写个function,费点劲,但不难。
修约间隔.png
 楼主| sunrry 发表于 2021-8-11 11:45:05 | 显示全部楼层
难者不会  会者不难
wangyiyong7703 发表于 2023-9-18 18:32:41 | 显示全部楼层
特殊情况适应了么,3.001,8.9999。还是用了编程,要全部用内建函数。编程可以把很多漏洞补上
wangyiyong7703 发表于 2023-9-18 18:34:09 | 显示全部楼层

A2输入待修约数值,B2输入保留小数点位数,C2输入公式。对9.9999多的情况不适用,还待改进

IF(B2=0,IF(OR(AND(ISEVEN(INT(A2)),A2-INT(A2)=0.5),A2-INT(A2)<0.5),INT(A2),INT(A2)+1),IF(LEN(IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))=LEN(INT(A2)),IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2))&"."&REPT("0",B2),IF(LEN(INT(A2*POWER(10,B2)))+1>LEN((IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))),(IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))&REPT("0",LEN(INT(A2*POWER(10,B2)))-1-LEN((IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2))))),IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))))
 楼主| sunrry 发表于 2023-9-22 14:57:15 | 显示全部楼层
wangyiyong7703 发表于 2023-9-18 18:34
A2输入待修约数值,B2输入保留小数点位数,C2输入公式。对9.9999多的情况不适用,还待改进

IF(B2=0,IF(OR ...

你不觉得你的公式很麻烦么。。。。
wangyiyong7703 发表于 2023-9-22 17:11:10 | 显示全部楼层
sunrry 发表于 2023-9-22 14:57
你不觉得你的公式很麻烦么。。。。

开始设计有点麻烦而已,你直接复制使用有什么麻烦的。如果你用宏去做才真的麻烦。这个公式避开了宏代码,也相当于宏代码
 楼主| sunrry 发表于 2023-9-25 13:21:15 | 显示全部楼层
wangyiyong7703 发表于 2023-9-22 17:11
开始设计有点麻烦而已,你直接复制使用有什么麻烦的。如果你用宏去做才真的麻烦。这个公式避开了宏代码, ...

对对对,你说的都对。
wangyiyong7703 发表于 2023-10-2 13:05:28 | 显示全部楼层

IF(OR(AND(ISEVEN(MID(A2,FIND(".",A2)+B2,1)*1),MID(A2,FIND(".",A2)+B2+1,1)="5",IFERROR(RIGHT(A2,LEN(A2)-FIND(".",A2)-B2-1)*1,0)=0),MID(A2,FIND(".",A2)+B2+1,1)*1<5),LEFT(A2,FIND(".",A2,1)+B2),IF(IFERROR(FIND(".",LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2),1),0)=0,LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2)&"."&REPT("0",B2),LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2)&REPT("0",B2-(LEN(LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2))-IFERROR(FIND(".",LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2),1),0)))))
wangyiyong7703 发表于 2023-10-2 13:06:19 | 显示全部楼层
sunrry 发表于 2023-9-25 13:21
对对对,你说的都对。

新的算法做的,麻烦抽空指正一下。
 楼主| sunrry 发表于 2023-10-7 13:09:06 | 显示全部楼层
wangyiyong7703 发表于 2023-10-2 13:06
新的算法做的,麻烦抽空指正一下。

1、小数点有效位数为0直接报错
2、多次计算后的浮点小数无法避免,后面一堆错误。(可以看图,B2=A2+0.1,C2=B2+0.1,以此类推)
1696655292511.jpg
 楼主| sunrry 发表于 2023-10-7 13:20:27 | 显示全部楼层
=IF(ABS(ABS(A2/1*10^B2-TRUNC(A2/1,B2)*10^B2)-0.5)<10^-7,CEILING(ABS(TRUNC(A2/1,B2)),2*10^-B2)*SIGN(A2/1)*1,ROUND(A2/1,B2)*1)
wangyiyong7703 发表于 2023-10-7 15:05:41 | 显示全部楼层
sunrry 发表于 2023-10-7 13:09
1、小数点有效位数为0直接报错
2、多次计算后的浮点小数无法避免,后面一堆错误。(可以看图,B2=A2+0.1, ...

谢谢,,,,,,
wangyiyong7703 发表于 2023-10-7 15:17:07 | 显示全部楼层
本帖最后由 wangyiyong7703 于 2023-10-7 15:29 编辑
sunrry 发表于 2023-10-7 13:20
=IF(ABS(ABS(A2/1*10^B2-TRUNC(A2/1,B2)*10^B2)-0.5)


我设计的是保留多少位小数的,1位以上,不含0位的。0位及以上可以再设计。主要是出现整数后的加零补位。你说的浮点问题具体指出来,我的是没有的
wangyiyong7703 发表于 2023-10-7 18:07:26 | 显示全部楼层
sunrry 发表于 2023-10-7 13:09
1、小数点有效位数为0直接报错
2、多次计算后的浮点小数无法避免,后面一堆错误。(可以看图,B2=A2+0.1, ...

我看了一下,不是我要解决浮点问题,是你的输入本来就有问题,6.94999999999999,不是显示的6.95
微信图片_20231007180624.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-19 02:37

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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