excel数据修约(四舍六入五成双)

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未找到开发者工具,可以按AltF11快捷键打开后,添加宏脚本,操作方法如下:

注意:修约文件见附页,可以桌面新建txt文件,将修约文件内容复制粘贴到txt中,保存后将文件名称改为“数据修约.bas”(需要将文件后缀改为bas)。

3 如何使用函数

将脚本导入完成后,与使用excel其他函数方式相同,在需要使用四舍六入五成双的格子内输入函数 =round2(a,b)。

4 函数说明

=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处理,以便自动计算结果。

5 附页

添加的宏函数内容如下:

注意:添加时,导入该文件时,需要将后缀改为.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
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值