Excel中实现”四舍六入五成双”数字修约规则
日期:2011-05-30来源:作者:sun301
Excel中实现”四舍六入五成双”数字修约规则
日常计算中数值普遍采用”四舍五入”来进行修约,但在某些领域,如工程领域,其计算数据需要更精确、更科学的计数保留法,这就涉及到”四舍六入五成双”的数字修约规则。
“四舍六入五成双”在GB/T 8170<数值修约规则与极限数值的表示和判断>中得以定义,具体规则如下:
1. 小于5舍去,即舍去部分的数值小于保留部分的末位的半个单位,则末位不变;
2. 大于5进1,即舍去部分的数值大于保留部分的末位的半个单位,则末位加1;
3.等于5时取偶数,即舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数,即当末位为偶数时,末位不变;当末位为奇数时,末位加1。
方法一:VBA实现
实施步骤:打开Excel,进入VBA编辑界面(快捷键ALT+F11),在菜单上点击[插入]->[模块],然后输入下列代码即可在Excel中象系统函数那样直接引用,函数格式XYS(number,num_digits),如将D2的当值修约成两位小数XYS(D2,2)。
Public Function XYS(X As Double, mm As Integer) As Double
Dim Temp1, Temp2 As String
Temp1 = 1
If mm < 0 Then
Temp1 = 10 ^ Abs(mm)
X = X / Temp1
mm = 0
End If
If ((Int((Abs(X) - Int(Abs(X))) * 10 ^ mm) Mod 2) = 0 And (Abs(X) * 10 ^ mm - Int(Abs(X) * 10 ^ mm)) <= 0.5) And X <> Val(Round(Abs(X), mm) * Sgn(X)) Then
XYS = Val((Round(Abs(X) - 10 ^ (-mm) / 5, mm)))
Else
XYS = Val(Round(Abs(X), mm))
End If
XYS = Val(XYS * Sgn(X) * Temp1)
End Function
方法二:函数公式实现
具体过程:
A2为需要修约的数据
B2为需要修约的位数
C2为修约结果,公式如下:
IF(((A2*10^(B2+1)-INT(A2*10^(B2+1)))<=0)*(MOD(TRUNC(A2*10^(B2+1)),5)=0)*(1-MOD(INT(A2*10^B2),2))=1,TRUNC(A2,B2),ROUND(A2,B2))
讲解:
1.1 ((A2*10^(B2+1)-TRUNC(A2*10^(B2+1)))<=0)判断需要修约的多一位上是否还有数据,如果有就返回0,没有返回1.
1.2 (MOD(TRUNC(A2*10^(B2+1)),5)=0)判断需要修约下一位是否为5,是5返回1不是5返回0
1.3 (1-MOD(INT(A2*10^B2),2))判断修约位数是否为双数 双数返回1 单数返回0
当1.1 1.2 1.3均为1的时候(即修约下两位没有数下一位且为5修约位数为双数,例如0.245,这时候不能四舍五入了,而是要去掉修约位数下一位的5,变为0.24)
附:
1)将A1修约成整数时的公式如下:
IF(((A1*10^1-INT(A1*10^1))<=0)*(MOD(TRUNC(A1*10^1),5)=0)*(1-MOD(INT(A1*10^0),2))=1,TRUNC(A1,0),ROUND(A1,0))
2)将A1修约成一位小数时的公式如下:[size=5]
IF(((A1*10^2-INT(A1*10^2))<=0)*(MOD(TRUNC(A1*10^2),5)=0)*(1-MOD(INT(A1*10^1),2))=1,TRUNC(A1,1),ROUND(A1,1))
3)将A1修约成二位小数时的公式如下:
IF(((A1*10^3-INT(A1*10^3))<=0)*(MOD(TRUNC(A1*10^3),5)=0)*(1-MOD(INT(A1*10^2),2))=1,TRUNC(A1,2),ROUND(A1,2))
4)将A1修约成三位小数时的公式如下:
IF(((A1*10^4-INT(A1*10^4))<=0)*(MOD(TRUNC(A1*10^4),5)=0)*(1-MOD(INT(A1*10^3),2))=1,TRUNC(A1,3),ROUND(A1,3))[/size]
回复