一、一舍二入取舍的取舍方式
在实际的工作中,四舍五入是经常会被用到的取舍方式,但是在一些特定的环境下,对于其他的一些取舍方式就会被用到。其中一种就是一舍二入的取舍方式。
在这里以精确两位的方式进行取舍,也就是判断小数点后第三位的值,如果汪数部分第三位上的值大于1,那么向前一位进1,否则的话将第三舍掉。如下图:
首先,对于取整时,对于上述的数字,设计时那么分水岭就是0.2与0.8,就是对正数加止0.8与对负数减去0.8,然后利用TRUNC函数进行截取。如果是对上图中的数字利用一舍下入的方法进行取舍时可以采用的公式为:
=SIGN(C2)*TRUNC(ABS(C2)+0.8)
如上图中的D2单元格。如C2单元格中这10.213,是正数,给此函数加上0.8以后,就变成了11.013,然后再截取整数部分,即可获得结果为11。SIGN函数的功能是如果目标值是负数,那么返回1,如果为0,返回0,如果是负数,那么返回-1。所以可以利用这一特点来获取对象是正数还是负数。
那么我们接着讨论保留两位小数的时候,我们就需要为这个数字扩大1000倍,进行舍入后再缩小100倍。那么C2单元格的公式可以写成:
=SIGN(C2)*(TRUNC(ABS(C2*100)+0.8))/100
如果保留三位有效数字的话那么扩大与缩小的倍数就是1000,以此类推。
注意:根据以上的方法与概念,我们也可以设计二舍三入,三舍四入以及其他的一些舍入的方法,最重要的是就是要注意分水领,这才是解题的突破口。
二、四舍六入五单双的取舍方式
为了避免四舍五入造成的偏差大的情况,在一些特殊的行业会采用的四舍六入五单双的舍入方法对数字进行修约。四舍六入五单双也叫四舍六入五成双,或者四舍六入五留双,有些时候也叫四舍六入、奇进偶舍。
具体有以下几个规则:
要保留的数值后第一位不是5,直接四舍六入;
要保留的数值后第一位是5且5前面是偶数,不进位;
要保留的数值后第一位是5且5前面是奇数,进位。
在Excel函数中,没有一种函数能直接进行此种方式的修约,在大多的情况下都是根据需要进行VBA编程进行处理的。这里以下图给的修约数字进行设计该种舍入方式的公式。要求对下列的数字保留一位小数进行四舍六入五单双的舍入。
B3单元格的公式为:
=ROUND(B2,0)-(ABS(TRUNC(B2/2)*2-B2)=0.5)*SIGN(B2)
B6单元格的公式为:
=ROUND(B5,1)-(ABS(TRUNC(B5*5)*2-B5*10)=0.5)*SIGN(B5)/10
B9单元格的公式为:
=ROUND(B8,2)-(ABS(TRUNC(B8*50)*2-B8*100)=0.5)*SIGN(B8)/100
B12单元格的公式:
=ROUND(B11,-1)-(ABS(TRUNC(B11/20)*2-B11/10)=0.5)*SIGN(B11)*10
从上面前三个公式中我们就可以总结出在小数点位数后修约的思路过程:
以保留一位小数为例,我们是对保留的位数后的数字进行判断,当要保留位数上的数字为5时且5前为偶数时,先给这个数字乘以5后修剪,再乘以2,然后再减去该数字乘以10,就对该数字完成了修约。例如:2.65保留一位小数,2.65*5=13.25,然后截取整数部分TRUNC(13.25*2)=26,然后26-26.5取绝对值后为0.5,等于0.5,则为TRUE,TRUE=1,然后获取正负号,再对这个数进行进位,那么就为2.7-1/10=2.6.
同理,我们就可以得出其他的要保留的位数的方法,对于上述的情况主要判断如果保留数字后面为5且5前的数字的奇偶性是十分关键的一步,一般是进行构造,对于思维的逻辑性与推理性是一定考验。
代码:
各位小伙伴们觉得以上的舍入方法在使用的时候有一定的难度,可以直接使用下同的VBA代码,这段定码定义了一个自定义函数cround,大家可以将下面的代码写入到VBE中,然后在工作有里直接输入函数名称即可,别忘了保存成xlsm格式。
Function cround(c, d%)' 本代码实现了按四舍六入五留双的规则,保留指定位数的有效数字。' 本代码的思路是将原始数据分为大于或小于1的两种情况,再分别进行处理。' 小于1的处理代码结果是完美的,代码也简明易懂。' 原始数据大于1的话,先将它除以适宜的倍数,使其刚好小于1,再借助小于1的处理代码进行处理。Dim p As Integercc = CDec(c) '转换为实数,如无此语句,在引用单元格时会出错,如:cround(A1/A2,1)If cc And cc1 = Split(cc, ".")(1) '按“.”对字符串进行分割,取第二个字符串,如:0.0035,分割为0和0035,这里取0035 p = Len(cc1) - Len(cc1 * 1) 'cc*1后转换为数字,如:0035*1=35,p即为小数点后“0”的个数(非零数字后的零不算)。 cround = VBA.Round(cc, d + p) '使用VBA中的round函数(即四舍六入五留双)进行修约Else cc1 = Split(cc, ".")(0) * 1 '按“.”对字符串进行分割,取第一个字符串,如:10.0035,分割为10和0035,这里取10 m = Len(cc1) '记录整数部分的字符长度。 cc2 = cc / (10 ^ m) '将原大于1的原始数据除以倍数值,转换成刚好小于1的数据,然后用前面小于1的代码进行处理。 cc3 = Split(cc2, ".")(1) '这里的代码实际上同小于1的处理代码。 p = Len(cc3) - Len(cc3 * 1) cround = VBA.Round(cc2, d + p) * (10 ^ m) '将结果乘以原来的倍数值,返回原始的数位。End IfEnd Function
注:以上代码源自网络,如有不妥,请后台告知删除。