金币
UID86121
帖子
主题
积分6304
注册时间2013-4-11
最后登录1970-1-1
听众
性别保密
|
欢迎您注册蒲公英
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 亡灵J. 于 2016-7-17 12:04 编辑
首先 四舍六入五留双 这个规则大家都知道 但是在excel中除了特殊说明以外 一般只保留15位有效数字 之后就用 0补充 如下图
我们计算的过程中一般也不回用到这么多 那么 遇到有效位数后1位 为5的情况 并且5之后没有了的情况就更少了
再者 这个规则主要是对于手工计算 或者分步计算时 四舍五入对误差的积累 使得最终结果偏大
对于excel来说 每个计算过程都是保留15位有效数字 用四舍五入 最终偏大的情况应该可忽略不计
大家讨论下这个问题 在计算机计算时 是否可以直接用四舍五入代替原本的四舍六入五留双
虽然我个人认为在excel中这条规则没什么卵用 但是 可能还是会有用 所以写了一下代码
用法:
首先要启用宏 这个可以自行百度
复制代码 打开excel 摁下ALT+F11 打开vba编辑器 插入 模块 然后粘贴 关闭vba编辑器
在excel中 任何一个单元格输入 =sslr(x,y) 其中x可以为数字也可以是单元格 比如A1 y位小数点后的有效位数 比如要A1单元格中有 0.1258这个数字 要保留2位小数 则在选定单元格输入=sslr(0.1258,2)或=sslr(A1,2) 即可
代码如下
Private Function sslr(X As Double, mm As Integer) As Double
If Int(X * 10 ^ (mm + 1)) Mod 10 < 5 Then
sslr = Int(X * 10 ^ mm) / 10 ^ mm '有效位数后一位小于5的情况
ElseIf Int(X * 10 ^ (mm + 1)) Mod 10 = 5 Then '有效位数后一位等于5的情况
If Int(X * 10 ^ mm) Mod 2 = 0 And Int(X * 10 ^ 16) / (X * 10 ^ mm) = 30 / mm Then '有效位数后一位等于5并且5后面至小数点后16位均为0的情况
sslr = Int(X * 10 ^ mm) / 10 ^ mm
Else: sslr = Int(X * 10 ^ mm + 1) / 10 ^ mm '有效位数后一位等于5并且5后面至小数点后16位有一位不为0的情况
End If
'有效位数后一位大于5的情况
ElseIf Int(X * 10 ^ (mm + 1)) Mod 10 > 5 Then
sslr = Int(X * 10 ^ mm + 1) / 10 ^ mm
End If
End Function
也可以直接下载表格使用 两个都可以 1个是2003 一个是2010 关键还是要启用宏
新建 Microsoft Excel 工作表.xlsm
(11.7 KB, 下载次数: 32)
|
|