C#语言应用于银行家舍入法与传统四舍五入法的比较实验

摘要:在现实中的金融场景中,各个数字有小数点是很常见的事。在数据量少的情况下,小数点后两位怎么取舍问题不大,但如果数据量多的话,取舍的方法不同,数据在汇总时的误差也会有很大的差别。通过实验数据分析,得出银行家舍入法在数据量大的时候,精确度相对来说要比四舍五入法要好的结论。

关键字:银行家舍入;传统四舍五入;精准计算

C # language is applied to the banker rounding method was compared with the conventional rounding method experiment

WANG Jia-Liang

Abstract: In reality the financial scene, each number has decimal point is a very common thing. In the case of data quantity is little, how two decimal places trade-off problem is nothing, but if the amount of data, choice of methods, data in summary the error also can have very big difference. By analyzing the experimental data, it is concluded that the banker rounding method in a large quantity of data, accuracy than rounding method relatively good conclusion.Key words: bankers rounding; the traditional round; accurate calculation

1.前言

在现实中的金融场景中,各个数字有小数点是很常见的事。不论是体量大的金融公司还是小的金融公司,只要金融有关,它的金融数字小数点后的位数就会少。小数点后的数字位数越多,越精确,也是常理。不过它给用户展示时,一般只取舍到小数点后两位。在数据量少的情况下,小数点后两位以哪种方式取舍,数据汇总误差不大,但如果数据量多的话,取舍的方法不同,数据在汇总时的误差也会有很大的差别。

C#语言是微软开发的一种面向对象的编程语言,它具有语法简洁、完整的安全性与错误处理以及兼容性与灵活性等特点。本文今天就以C#语言来作为编写实验数据生成器的基础语言,批量生成实验数据,从而通过几轮不同量级的数据生成实验,通过对生成数据的汇总与分析,对比实际计算中,银行家舍入法与传统的四舍五入法哪一种舍入法的汇总与原始数据比更为精准。虽然历史上已经有人证明过银行家舍入法的优越性,不过出于爱好,自己还是打算亲自进行实验验证。

2.原理介绍

2.1 四舍五入法

四舍五入即我们常识中的四舍五入。大家都比较熟悉。保留位数的后一位,大于等于5,进一,否则舍去。

例如:

(1)1.234,保留小数点后两位,结果是1.23。

(2)1.235,保留小数点后两位,结果是1.24。


2.2 银行家舍入法

银行家舍入算法:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

例如:

11.3651,属于五后非零就进一,保留小数点后两位,结果是1.37

21.3650,属于五后为零看奇偶,五前为偶应舍去,保留小数点后两位,结果是1.36

31.3550,属于五后为零看奇偶,五前为奇要进一,保留小数点后两位,结果是1.36

银行家舍入是IEEE规定的小数舍入标准之一,也是IEEE目前规定中最优秀的舍入方法,因此所有符合 IEEE 标准的语言都应该实现这种算法。

3.实验比较

3.1 实验方法

我们使用程序,生成一定批量的带有小数点后4位的随机数,然后通过将这些随机数求和,同时分别对每个随机数使用传统四舍五入法保留小数占后两位,进行求和,以及分别对每个随机数使用银行家舍入法保留小数点后两位,进行求和,最后对比两种舍入法求和后和随机数求和后的数据进行对比,比较哪种舍入法同随机数求和后的结果最接近。初始生成数据量为1000条,之后生成的数据量级以10倍的比例增加。

3.2 C#语言数据生成器编写

主要使用C#语言编写基于控制台的实验数据生成器。所使用的IDEIntegrated Development Environment)为Microsoft Visual Studio 2013。所编写的代码如下:

根据以上代码运行显示效果如下图1所示,只需要输入需要生成的随机数的数量,程序就会自行生成指定数量的随机数,并求和,同时会分为以传统四舍五入的方法和银行家舍入的方法,对原始数据取舍后,并求和。


1 代码运行显示效果

3.3 实验过程

数据记录表如下表1数据记录表所示。表格中数据量栏位,为生成的带有小数点后4位的随机数的数量,样本数据栏位,为以数据量生成随机数的和,四舍五入栏位为以生成的各样本数据以四舍五入的方法保留小数点后两位的数据求和之后的结果,银行家栏位为以生成的各样本数据以银行家舍入法保留小数点后两位的数据求和之后的结果。胜出者栏位,是以四舍五入保留小数点后两位的求和结果,以及银行家舍入法保留小数点后两位的求和结果分别同原始数据的求和结果作比较,若四舍五入法更接近原始数据结果,则胜出者填写-1,若银行家舍入法更接近原始数据结果,则胜出者填写1。最后将胜出者栏位求和,如果是负数,则四舍五入法胜出,如果是正数则银行家法胜出。


数据记录表

数据量

样本数据

四舍五入(-1

银行家(1

胜出者

1000

499.5879

499.5

499.49

-1

1000

492.0308

492.12

492.1

1

1000

507.0111

506.93

506.9

-1

1000

503.1209

503.26

503.15

1

1000

518.0088

517.97

517.95

-1

10000

4984.8203

4985.25

4984.89

1

10000

4957.3182

4958.12

4957.71

1

10000

5015.7731

5015.97

5015.6

1

10000

5007.4791

5008.13

5007.71

1

10000

4986.1471

4986.52

4986.19

1

100000

49929.589

49933.81

49930.11

1

100000

50055.8525

50060.86

50057.14

1

100000

49865.4771

49870.7

49867.43

1

100000

49917.8423

49924.37

49920.75

1

100000

50144.3218

50148.03

50144.33

1

1000000

499983.7733

500029.83

499993.3

1

1000000

499521.6729

499576.42

499540.46

1

1000000

500346.2036

500393.05

500357.61

1

1000000

499554.854

499614.1

499577.88

1

1000000

500191.542

500244.8

500209.05

1

10000000

4998153.809

4998648.96

4998287.82

1

10000000

5000211.921

5000715.05

5000353.53

1

10000000

4998489.693

4998977.45

4998614.93

1

10000000

4999397.266

4999885.97

4999524.01

1

10000000

4999493.114

4999992.22

4999632.16

1

19


3.4 数据分析

为了方便比较,统一将表1数据记录表中的样本数据、四舍五入数据、银行家数据放大至千万的数量级,然后,分别求四舍五入法与基准值的差值以及银行家舍入法与基准值的差值,对比两者的差值,差值越小越接近真实值。生成的数据表如下表2 与样本数据差值数据所示。

2 与样本数据差值数据

与样本数据差值

样本数据

四舍五入

银行家

四舍五入

银行家

49958790

49950000

49949000

-8790

-9790

49203080

49212000

49210000

8920

6920

50701110

50693000

50690000

-8110

-11110

50312090

50326000

50315000

13910

2910

51800880

51797000

51795000

-3880

-5880

49848203

49852500

49848900

4297

697

49573182

49581200

49577100

8018

3918

50157731

50159700

50156000

1969

-1731

50074791

50081300

50077100

6509

2309

49861471

49865200

49861900

3729

429.0000001

49929589

49933810

49930110

4220.999999

520.9999989

50055852.5

50060860

50057140

5007.499999

1287.499999

49865477.1

49870700

49867430

5222.9

1952.9

49917842.3

49924370

49920750

6527.7

2907.7

50144321.8

50148030

50144330

3708.2

8.199999705

49998377.3

50002983

49999330

4605.670002

952.6700012

49952167.3

49957642

49954046

5474.71

1878.71

50034620.4

50039305

50035761

4684.639998

1140.639998

49955485.4

49961410

49957788

5924.6

2302.6

50019154.2

50024480

50020905

5325.8

1750.799999

49981538.1

49986489.6

49982878.2

4951.509001

1340.109001

50002119.2

50007150.5

50003535.3

5031.294993

1416.094993

49984896.9

49989774.5

49986149.3

4877.569001

1252.369

49993972.7

49998859.7

49995240.1

4887.038002

1267.438001

49994931.1

49999922.2

49996321.6

4991.055014

1390.455014

根据与样本数据差值数据生成柱状图,如下图1 四舍五入与银行家对比图所示。

2 四舍五入与银行家对比图

从图2四舍五入与银行家对比图中,可以明显看出,在数据量比较少的情况下,四舍五入与银行家舍入法差别并不是很大,而且在某些时候,甚至比银行家舍入法更接近样本数据的真实值。不过,随着随机数样本数量的不断增加,银行家舍入法的优势逐渐体现出来。在实验进行到第6次的时候,也就是随机数的样本数达到10000个的时候,银行家舍入法就开始呈现更加接近真实样本数据值的效果。而且之后在第16次的实验中,也就是数据量达到1百万时,银行家舍入法与传统的四舍五入法相比,与样本数据真实值的差别显著缩小。可见,银行家舍入法,在数据量比较大的时候,效果更为明显。

4. 结论

4.1 结果分析

从实验数据上看,银行家舍入法在数据量大的时候,精确度相对来说要比四舍五入法要好。如果从统计学的角度解释,那就是传统的四舍五入法使舍入后的结果有的变大,有的变小,而银行家舍入法不像四舍五入法那样逢五就入,使得结果更偏向大数,所以,银行家舍入法则在结果上更平均。如果从概率论的角度来解释,我们知道,在计算结果中,舍入位数字出现(0-9)的概率可以看作是均等的。那么,四舍五入法,逢五进一的规则,则导致结果中,进的概率,56789,是0.5,而舍的概率,1234,是0.4,可以明显看出进舍双方是不均等的。而对于银行家舍入法,则是更进一步缩小二者之间的概率差距。所以, 银行家舍入法""传统的四舍五入法"要更为科学,相比四舍五入算法,其优点是:公平性更好。

4.2 不足与完善

实验本身的不足之处在于样本数据量仍然不够多,而且程序设计比较简单,不够自动化,程序计算出的结果需要手动录入Excel中。而且数据样本数达到1亿时,数据竟然超出内存支持的大小。其实实验方法仍然有很多改进之处,例如换一台配置更强劲的计算机,同时让程序将数据自动生成至Excel数据表中,节省了人工录入的繁琐。而且实验次数,不仅仅是现在的25次,可以成倍的增长,以获取更多的数据,达到更精准的实验结果。而在现实生活中,例如金融活动中的数据,往往量比较大,结果需要更准确,虽然银行家舍入法更接近真实值,但在金融的视角,仍然不够精确。所以,在金融系统的设计中,往往是采用放大和缩小的方法,来获取更为精准的结果。对于有一些数据,也采用一些简单的特殊处理。例如:一个用户借款10000元,三个月,计算每个月还的本金时,结果是3333.33333,但不论你怎么计算,仍然是有误差的。这个时候,往往采用,前两期是取平均数,3333.3333,而最后一期则使用 10000-6666.6666= 3333.3334,来消除计算误差。

其实每一种方法都有每种方法的实际用途,在现实计算中,一定要分析场景,根据具体的场景,来设计有针对性的计算解决方案,这才是最优的解决问题方法。