ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lycost

[求助] 请教四舍六入五单双

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-8-11 04:07 | 显示全部楼层
[em17]多谢各位给我这么多精彩的解法,定当好好研究,努力学习

TA的精华主题

TA的得分主题

发表于 2004-8-14 16:27 | 显示全部楼层

=IF(AND(RIGHT(A1*100,1)="0",RIGHT(A1*10,1)="5")=TRUE,IF(INT(A1)/2=INT(INT(A1)/2),INT(A1),ROUND(A1,0)),ROUND(A1,0))

AND(RIGHT(A1*100,1)="0",RIGHT(A1*10,1)="5")=TRUE 判断是否为一位小数,且是0.5

如果不符合上术要条件,按普通四舍五入法则处理,否则判断整数部分的奇偶

TA的精华主题

TA的得分主题

发表于 2004-9-7 02:41 | 显示全部楼层
=IF(MOD(INT(A1),2)=0,IF(MOD(A1,1)=0.5,INT(A1),INT(A1+0.5)),INT(A1+0.5))

TA的精华主题

TA的得分主题

发表于 2007-2-25 19:59 | 显示全部楼层

=ROUND(A7,2)-IF(AND(ROUND(A7,2)>A7,TRUNC(A7*200)=A7*200,TRUNC(A7*100/2)=TRUNC(A7*100)/2),0.01)

这是三楼第一个链接中10楼dongmu先生给出的公式,我改造了一下:

=ROUND(A7,2)-IF(AND(A7-0.005=ROUNDDOWN(A7,2),TRUNC(A7*100)/2=TRUNC(A7*100/2)),0.01)

这是保留两位小数的情况。

其中的第一个条件A7-0.005=ROUNDDOWN(A7,2),是判断小数点后第二位数以后的所有数字是否是纯粹的0.005,若此条件改写为A7-ROUNDDOWN(A7,2)=0.005则不行,似乎是浮点小数出了问题。

第二个条件TRUNC(A7*100)/2=TRUNC(A7*100/2)),是判断小数点后第二位数是否是偶数。

若同时满足上面两个条件,就不能按照普通的“四舍五入”原则处理数据了,小数点后第三位的0.005就不再向上进位。

[此贴子已经被作者于2007-2-25 20:03:35编辑过]

TA的精华主题

TA的得分主题

发表于 2007-2-25 20:22 | 显示全部楼层

这种数字修约规则,一般的说法是:“四舍六入,五逢单进双舍”。

多数情况下,和“四舍五入”规则并无不同,只是少数情况下才使用这个规则,现在来看看这个“少数情况”,以保留小数点后三位为例:

0.06450000000001,小数点后第三位数以后的数不是纯粹的0.0005,仍按一般的“四舍五入”原则进位为0.065

0.0615,第五位数为0,则要看第三位数的奇偶情况,3为单数,故进位为0.062——这是“逢单进”

0.0685,第三位数8为偶数,故舍去第四位数5不进位,为0.068——这是“逢双舍”

只有第三例才与“四舍五入”规则不同。由第一例可知,“六入”的说法并不科学。

TA的精华主题

TA的得分主题

发表于 2007-2-25 20:30 | 显示全部楼层

我们在小学时学的“四舍五入”规则,是一种不太精密的数字修约规则。比如我们对一些事物进行分类百分比统计,然后再对这些百分比进行合并,你可以发现,他们的和有时是99.99%,有时是100.01%,问题就出在这个“四舍五入”规则上面。

对于一些精密的工程,如航天、精确制导等,这个误差是很大的。

TA的精华主题

TA的得分主题

发表于 2007-2-26 12:41 | 显示全部楼层

关于负数出错的问题讨论:

经过进一步测试,发现16楼前人和我的公式都存在一些问题。如将5.525改为负数-5.525,则对需要修约的0.005的判断会出错,即0.005也存在正负号的问题。因此,A12-0.005=ROUNDDOWN(A12,2)这个条件判断改为:

ROUND(MOD(A12,0.01),15),这个条件判断解决了0.005的正负号问题。

本来,从理论上说,MOD(A12,0.01)就能判断第二位小数以后的数字是否是纯粹的0.005,但存在浮点小数的问题,加上ROUND函数就是解决浮点小数的问题。所以有:

公式一:ROUND(A12,2)-(ROUND(MOD(A12,0.01),15)=0.005)*(TRUNC(A12*100)/2=TRUNC(A12*100/2))*IF(A12<0,-0.01,0.01)

其中最后的IF(A12<0,-0.01,0.01)也是解决正负号的问题。

第二位小数的奇偶性用(TRUNC(A12*100)/2=TRUNC(A12*100/2))这个条件判断,也可以用MOD(RIGHT(TRUNC(A12*100)+1),2)来判断,所以有:

公式二:ROUND(A12,2)-(ROUND(MOD(A12,0.01),15)=0.005)*MOD(RIGHT(TRUNC(A12*100)+1),2)*IF(A12<0,-0.01,0.01)

若想保留三位小数,可以将公式中的0.01改为0.001,将0.005改为0.0005,将100改为1000。其余类推。

TA的精华主题

TA的得分主题

发表于 2007-2-26 12:53 | 显示全部楼层

值得指出,3楼链接2中5楼的gdliyy网友用了这样的公式:

=ROUND(A1,0)-(RIGHT(INT(A1*10))-5=0)*MOD(RIGHT(INT(A1)+1),2)

用INT公式判断也会出现负数出错的问题,改用TRUNC公式即可。

TA的精华主题

TA的得分主题

发表于 2007-2-26 13:55 | 显示全部楼层

=ROUND(A1,1)-IF(MOD(A1*100,20)=5,0.1,0)

A1=5.35 四舍五入后是 5.4

A1=5.45 四舍五入后也是 5.4

——以上是Samsea网友的公式,负数时也出错。改为如下公式(保留两位小数):

==ROUND(A7,2)-(ABS(MOD(A7*1000,IF(A7<0,-20,20)))=5)*IF(A7<0,-0.01,0.01) 

0w8iBwFJ.rar (2.21 KB, 下载次数: 29)
[此贴子已经被作者于2007-2-27 14:09:31编辑过]

1WMFj14Y.rar

2.21 KB, 下载次数: 29

TA的精华主题

TA的得分主题

发表于 2007-2-26 16:22 | 显示全部楼层

上述公式是针对一位小数而写的

我闲着无聊 自己琢磨了一下   写了一个公式对于任意数值都是适用的  请大家指教

IF(C15=0,0,IF(VALUE(MIDB(VALUE(C15-INT(C15)),3,1))<5,INT(C15),IF(VALUE(MIDB(VALUE(C15-INT(C15)),3,1))>5,INT(C15)+1,IF(MOD(INT(C15),2)=0,INT(C15),INT(C15)+1))))

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 03:05 , Processed in 0.032572 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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