大家好,欢迎来到IT知识分享网。
1、什么是四舍六入五成双
这里“四”是指≤4 时舍去,“六”是指≥6时进上,“五”指的是根据5后面的数字来定,当5后有非0数时,舍5入1;当5后为0时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0当做偶数)。
2、excel设置宏函数
打开excel,选择开发工具,点击左上角的visual basic,将四舍六入五成双的脚本移动至打开的visual basic里。
若excel未找到开发者工具,可以按Alt+F11快捷键打开后,添加宏脚本,操作方法如下:
注意:修约文件见附页,可以桌面新建txt文件,将修约文件内容复制粘贴到txt中,保存后将文件名称改为“数据修约.bas”(需要将文件后缀改为bas)。
将脚本导入完成后,与使用excel其他函数方式相同,在需要使用四舍六入五成双的格子内输入函数 =round2(a,b)。
=round2(a,b,c)a表示需要修约的数值,b为需要保留的有效数字位数,c为可选参数,未指定时按FALSE处理,c为FALSE时,修约后数据不保留/显示无意义0,且单元格按数值型存储;c为TRUE时,修约后数据保留/显示0的有效数位,且单元格按文本型存储,参与其他函数计算(求和、乘、除……)时,需要做+0处理,否则不会自动计算。
比如:
当a为3.33515时,表示需要修约的数字。
当b为3时,表示修约后需要保留三位有效数字。
当c为FALSE时,如round2(1.2,3,FALSE)修约后为1.2(不保留/显示无意义0)。
当c未设置时,如round2(1.2,3)修约后为1.2(c未设置时,默认为FALSE,不保留/显示无意义0)。
当c为TRUE时,如round2(1.2,3,TRUE)修约后为1.20(保留/显示无意义0,为了显示3位有效数字,所以显示出了无意义0)。
举例:
如round2(3.3150,3)修约后为3.32(5后面为0,5前面为奇数,舍五进一);
如round2(3.3250,3)修约后为3.32(5后面为0,5前面为偶数,舍五不进一);
如round2(3.3050,3)修约后为3.30(5后面为0,5前面为0时,舍五不进一);
计算乳铁蛋白检测值的平均值且保留三位有效数字,则平均值一格下方表格函数为:
=Round2(AVERAGE(L20:N21),3);
计算结果为(2.3346+4.3357)/2=3.33515
四舍六入五成双保留三位有效数字为3.34(5后面非0,舍五进一)。
注意:
当c设置为TRUE时,且若本单元格修约后参与其他公式计算,需要对修约结果进行+0处理,如下图所示:
如下图所示,蓝框数据做求和计算,未做+0处理时,求和结果错误。
注意:
当c设置为TRUE时,若当前单元格为中间计算变量,可以将当前单元个设置为 常规,也可不做+0处理,以便自动计算结果。
添加的宏函数内容如下:
注意:添加时,导入该文件时,需要将后缀改为.bas后再导入。
'----------------------------------------------- ' 鉴于vba中的round与工作表的round不同,这里使用工作表中的round,因为vba中的round有问题。 ' vba中特别同时保留两个round应该是有目的吧,其他函数或操作符一般只有一个。 '----------------------------------------------- Function Round2(Num As Double, DIG As Byte, Optional TorV As Boolean, Optional Way As Boolean, Optional Trn As Boolean) As Variant Dim Temp1 As Double Dim TFM As String Dim Temp2 As String Dim Tempoff As Double 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 Way And (10 ^ Int(.Log(Temp1)) = Temp1 And Temp1 > Abs(Num)) If DIG > 14 And Trn Then Temp2 = "有效位数超过14位不能进位" GoTo ExitFn End If If Way Then 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 Else TFM = "0" If Not (Int(Temp1) = Temp1 And (Int(.Log(Temp1)) >= DIG - 1)) Then TFM = TFM & "." & .Rept("0", DIG - Int(.Log(Temp1)) - 1) End If Temp1 = Temp1 * Sgn(Num) Temp2 = .Text(Temp1, TFM) End With ExitFn: If TorV Then Round2 = Temp2 Else Round2 = Temp1 End If
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/148573.html