ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

保留有效位数并四舍六入2004-11-26新*

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-11-7 18:40 | 显示全部楼层 |阅读模式
保留有效位数并四舍六入2004-11-26新*摘自一位网友的提问:

引用:

既要四舍六入又要保留有效数字位数怎样设置?
各位大侠:因工作需要数据要求保留3位(或2位、4位)有效数字,且必须按4舍6入准则处理,如1.254    0.2515     1.225    1.22501     12300   保留3位有效数字且4舍6入分别为:  1.25     0.252     1.22     1.23    1.23E+04(或1.23× 10的四次方)  该用何函数,请各位高手帮忙啦!  谢谢!


特别感谢chenjun版主及其对修约规则的精辟解析和对本贴提出的许多宝贵建议。[em17][em17][em17][em17][em17][em17][em23][em24]
特别说明:

引用:

请注意工作表函数和自定义函数ROUND2都有一个参数作为有效位进位开关,当进位开关为1时,可以处理此例情况:0.99保留1位写成1.0,也就是多保留了一位;当进位开关为0时,0.99保留1位写成1。以满足一些特殊需要。详细分析请见本贴中chenjun版主的论述。
EXCEL限制:在选择有效位进位选项时,工作表函数在处理有效位12位以上时部分数值不准,自定义函数round2()则在15位以上时出现类似情况。这个问题将进一步修正。



1、工作表函数解法:
名称定义
NUM=解法!$A3

DIG=解法!$H$2

TRN=解法!$G$2

OFF=ROUND(ABS(NUM),-(INT(LOG(ABS(NUM)))-DIG+1))-(--RIGHT(NUM/10^(INT(LOG(ABS(NUM)))-DIG+1),2)=0.5)*(MOD(RIGHT(INT(ABS(NUM)/10^(INT(LOG(ABS(NUM)))-DIG+1)),1),2)=0)*10^INT(LOG(ABS(NUM))-DIG+1)

PLS=(10^INT(LOG(OFF))=OFF)*(OFF>ABS(NUM))*TRN
RST=IF(NUM=0,"0",IF(SIGN(NUM)=-1,"-","")&TEXT(OFF,"0"&IF((DIG=1)*(INT(LOG(OFF))=0)*(PLS=0),"",IF((INT(OFF)=OFF)*(DIG=1)*(PLS=0),"",".")&REPT("0",DIG+PLS-1))&IF(LOG(OFF)<1,REPT("0",-INT(LOG(OFF))),"E+###")))
2、自定义函数解法
'ROUND2(数值,保留有效位数,返回文本或数值,遇进位时增加有效位开关

Function Round2(Num As Double, DIG As Byte, Optional TorV As Boolean, Optional Trn As Boolean) As Variant
Dim Temp1 As Double
Dim TFM As String
Dim Temp2 As String
Dim Tempoff As Double

'-----------------------------------------------
' 鉴于vba中的round与工作表的round不同,这里
' 使用工作表中的round,因为vba中的round有问
' 题。vba中特别同时保留两个round应该是有目的吧,
' 其他函数或操作符一般只有一个
'-----------------------------------------------
    If Num = 0 Then
        Temp1 = 0
        Temp2 = "0"
        GoTo ExitFn
    End If
   
    With Application.WorksheetFunction
               
        Tempoff = Abs((--Right(Num / 10 ^ (Int(.Log(Abs(Num))) - DIG + 1), 2) = 0.5) _
        * ((--Right(Int(Abs(Num) / 10 ^ (Int(.Log(Abs(Num))) - DIG + 1)), 1) _
        Mod 2) = 0)) * 10 ^ Int(.Log(Abs(Num)) - DIG + 1)
        
        Temp1 = .Round(Abs(Num), -(Int(.Log(Abs(Num))) - DIG + 1))
        Temp1 = Temp1 - Tempoff
        
        Trn = Trn And (10 ^ Int(.Log(Temp1)) = Temp1 And Temp1 > Abs(Num))
        
        If DIG > 14 And Trn Then
            Temp2 = "有效位数超过14位不能进位"
            GoTo ExitFn
        End If
        
        If DIG = 1 And Int(.Log(Abs(Temp1))) = 0 And Not Trn Then
            TFM = ""
        Else
            If Not (DIG = 1 And Int(Temp1) = Temp1 And Not Trn) Then TFM = TFM & "."
            TFM = TFM & .Rept("0", DIG + Abs(Trn) - 1)
        End If
        
        TFM = "0" & TFM
        
        If Int(.Log(Temp1)) < 0 Then
            TFM = TFM & .Rept("0", -Int(.Log(Temp1)))
        ElseIf Int(.Log(Temp1)) > 0 Then
            TFM = TFM & "E+###"
        End If
        
        Temp1 = Temp1 * Sgn(Num)
        Temp2 = .Text(Temp1, TFM)
    End With
        
ExitFn:
        If TorV Then
           Round2 = Temp2
        Else
           Round2 = Temp1
        End If
End Function


[ 本帖最后由 apolloh 于 2008-11-8 17:56 编辑 ]

保留有效位数并四舍六入2004-11-26新(论坛改版重新上传).rar

17.71 KB, 下载次数: 901

TA的精华主题

TA的得分主题

发表于 2004-11-7 19:31 | 显示全部楼层
看看这个如何。 KdPtXFOS.rar (5.95 KB, 下载次数: 427)

TA的精华主题

TA的得分主题

发表于 2004-11-8 12:28 | 显示全部楼层

好像有的还不对:

0.2525——>0.2

21.22501——>21.22

TA的精华主题

TA的得分主题

发表于 2004-11-8 15:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
21.22501保留四位有效数字是否应该是21.23啊?

TA的精华主题

TA的得分主题

发表于 2004-11-8 16:27 | 显示全部楼层
以下是引用apolloh在2004-11-8 16:16:00的发言:

四舍六入五单双

后面全是0才单双

21.22500000——>21.22

21.22500001——>21.23

TA的精华主题

TA的得分主题

发表于 2004-11-21 17:38 | 显示全部楼层
不错,不用VBA的子程序(用自定义函数也没有办法的)来改变数字格式就只能转成文本格式显示了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-11-21 17:58 | 显示全部楼层

谢谢老大鼓励,偶会继续努力

不过文本格式也不影响计算

TA的精华主题

TA的得分主题

发表于 2004-11-22 10:22 | 显示全部楼层
还有点问题,如下: 1.2004按有效数3位修约后应为1.20不是1.2 9.9999按有效数3位修约后应为1.000E+001不是1.E+001

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-11-22 10:44 | 显示全部楼层
以下是引用chenjun在2004-11-22 10:22:00的发言: 还有点问题,如下: 1.2004按有效数3位修约后应为1.20不是1.2 9.9999按有效数3位修约后应为1.000E+001不是1.E+001

修约文件有吗,偶没见过,橙色部分是1.00E还是1.000E,不知道是不是问错了。

如果是1.00E已修正了在顶楼

TA的精华主题

TA的得分主题

发表于 2004-11-22 11:12 | 显示全部楼层

9.9999按3位有效数修约应该是10.00不是10.0,因为前面的10是9进位以后多出了一位,如果是10.0的话精度就变小了。

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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