如何处理报表中的舍位平衡

在报表的数据统计中,常常会根据精度呈现或者单位换算等要求,需要对数据执行四舍五入的操作,这种操作称为舍位处理。简单直接的舍位处理有可能会带来隐患,原本平衡的数据关系可能会被打破。

 

为了保证报表中数据关系的正确,就需要调整舍位之后的数据,使得数据重新变得平衡,这样的调整就叫做舍位平衡。在这里我们就讨论一下如何利用集算器来处理舍位平衡问题。

舍位处理往往会采取四舍五入计算,这时就会产生误差,而如果报表中有这些数据的合计数值,那么舍位时产生的误差就会积累,有可能导致舍位过的数据与其合计值无法匹配。例如,保留一位小数的原始的数据是4.5+4.5=9.0,而四舍五入只保留整数部分后,平衡关系就变为5+5=9了,看上去明显是荒谬的。在这样的情况下,需要在保持合计值正确的条件下,调整非合计数据舍位后的结果,使得数据关系重新平衡,例如调整为4+5=9。这个简单的例子就是典型舍位平衡。

1. 单向舍位平衡

如果在数据统计时,每个数据只用于一次合计,那么在处理舍位平衡时,只需要根据合计值的误差,调整使用的各项数据就可以了,这属于比较简单的情况。例如:

 

A

B

C

1

[1.48,0,1.42,0.32,6.48,0.98,1.39]

=A1.sum()

 

2

=A1.(round(~))

=round(B1)

=A2.sum()

A1的序列中存储了一些数据,在B1中计算了它们的合计值,结果如下:

现在,将数据取整,重新统计。A2中将序列中每个数据用round函数四舍五入取整,得到新的序列。在B2中则将B1中的结果取整,这是数据取整后应该获得的结果。在C2中则只是简单地用取整后的数据来求和。A2,B2和C2中结果分别如下:

显然,舍位后误差的累积导致数据不再平衡,将原始数据分别四舍五入后,总和由12变成了10。那么,能不能把合计数直接改为10呢?这是不行的,因为这样会使得最终结果与真实值完全不符。因此,为了保证舍位后仍然能够保持平衡关系,应该分别改变各个原始数据舍位后的结果。

舍位后总计产生的误差,称为“平衡差”,舍位平衡其实就是消除平衡差的过程。处理舍位平衡的规则有很多,下面我们分别进行研究:

(1) 将平衡差整理到第一个数据中。即:

 

A

B

C

1

[1.48,0,1.42,0.32,6.48,0.98,1.39]

=A1.sum()

 

2

=A1.(round(~))

>A2(1)+=round(B1)-A2.sum()

=A2.sum()

B2中,把平衡差折算到舍位后的第一个数据中。整理后,在C2中重新计算了舍位平衡处理后的合计值。A2和C2中的结果如下:

这种舍位平衡的处理规则最为简单。但是,舍位后第1个数据由1.48变为了3,明显偏移了很多,因此这样的处理不够合理,特别是在数据很多的情况下,平衡差也有可能会累积的很大,进而致使第1个数据产生非常荒谬的偏移结果。

(2) 将平衡差按照“最小调整值”,对绝对值比较大的数据进行分担调整。

所谓最小调整值,就是舍位后最小精度的单位值,例如在取整时,最小精度就是个位,最小调整值就是1或者-1。如果舍位后合计值变小,则需要将数据调大,那么最小调整值就是1;如果舍位后合计值变大,则需要将数据调小,最小调整值就是-1。而调整只针对绝对值比较大的数据,这样它们的相对偏差就会比较小。具体调整几个数,那就是合计值偏差除以最小调整值。

在这种规则下,前面问题的舍位平衡处理如下:

 

A

B

C

1

[1.48,0,1.42,0.32,6.48,0.98,1.39]

=A1.sum()

 

2

=A1.(round(~))

=round(B1)-A2.sum()

=sign(B2)

3

=A1.psort@z(abs(~))

>abs(B2).run(A2(A3(#))+=C2)

=A2.sum()

因为只是取整操作,因此C2中计算的最小调整值就是合计值偏差的正负;

A3中,根据原始数据的绝对值从大到小做了一个排序,结果就是排序后的序号。

B3是最主要的,因为只是取整操作,所以B2中的偏差绝对值是多少,就调整几个数。以此循环,依照原始值的绝对值大小,依次分配最小调整值。

C3是对调整后的A2重新验证了合计值。

调整后,A2和C3中的结果如下:

在这种方案中,平衡差由多个数据分担,而选择绝对值最大的数据会使得数据的相对变动最小。在结果中,1.48舍位后变为了2,6.48舍位后变为了7,调整平衡的结果还是比较理想的。

这种方案需要将数据按绝对值排序,执行效率不是很好,特别是在数据量比较大的情况下,排序会耗费较多时间。

(3) 将平衡差按照最小调整值,由不为0的数据依次分担。

在上一种调整舍位平衡的方案中,将误差由绝对值最大的一些数据来分担。在实际操作中,为了提高效率,减少排序操作,就可以适当简化,改为由顺序排在前几位的数据来分担。考虑到在四舍五入时,0并不会产生误差,而且如果修改数据中的0,这样的变动会比较明显,因此在调整时将保留原始数据中的0不变。

在这种规则下,前面问题的舍位平衡处理如下:

 

A

B

C

1

[1.48,0,1.42,0.32,6.48,0.98,1.39]

=A1.sum()

 

2

=A1.(round(~))

=round(B1)-A2.sum()

=sign(B2)

3

=A2.pselect@a(~!=0)

>abs(B2).run(A2(A3(#))+=C2)

=A2.sum()

A3中选择出原始数据中非0成员的序号,在B3中调整舍位后数据时,按顺序分担。调整后,A2和C3中的结果如下&

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值