来源:瞭望智库
文丨七君
本文转载自微信公众号“把科学带回家”(ID:steamforkids),原文首发于2020年7月9日,原标题为《利息被银行四舍五入后,你到底是赚了还是亏了?答案和想的不太一样》,不代表瞭望智库观点。
大家在小学就会学四舍五入对吧,四及以下被舍去,五以及更大的数字则进1。
这个在平时做题的时候没有什么问题,毕竟做错做对也不会来钱。那么问题来了,银行交易的最小单位是分,被小数点约掉的钱虽然不多,但是如果按照我们小学的四舍五入,你和银行到底谁亏谁赚呢?
举个例子,比如给5位储户的利息分别是0.000、0.001、0.002、0.003、0.004,这些厘被四舍五入掉了,因此银行赚了。
但是另外五位储户的利息是0.005、0.006、0.007、0.008、0.009,那么他们每人拿到的利息就是0.01,银行亏了。
而根据本福德定律的发现者弗兰克·本福德的测算,非第一位的数基本上符合随机分布,也就是0-9这10个数字出现的概率相同。那么每付出10笔利息,银行的总收益就是:
0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005
看到了吧,妥妥的亏钱。这还只是付10笔利息的情况,如果银行有上百万上千万的储户,那么亏损就更大了,每千万比利息,银行要亏5千块。
也就是说,四舍五入其实有不利于银行,而有利于储户。
话说回来,传统的四舍五入让银行亏钱的原因是因为把5都往大了算。为了减小差,有人设计出了一种叫做银行家舍入(Banker's Rounding)的算法。它的规则是这样的:
4及以下直接舍去;大于等于6时,进位后舍去;这两点和四舍五入一样;
5的情况比较复杂,如果5后面还有数字,则进位后舍去;如果5后面没有数字了,那么如果5前面是奇数,则进1,若5前面是偶数直接舍去5。
举几个例子:
3.016 ≈ 3.02
3.013 ≈ 3.01
3.015 ≈ 3.02
3.045 ≈ 3.04
3.04501 ≈ 3.05
如果数字随机分布,则银行家舍入引起的误差比传统的四舍五入小,因为银行家舍入法在计算时,平均一半的数变大,而另一半变小。当然,银行家舍入也不是完全没有误差,其误差和操作次数的平方根成正比。
不过需要指出的是,虽然这种舍入法叫“银行家舍入”,但实际上和银行关系不大。
我国金融系统的大部分算法就是用四舍五入。比如分以下的利息、中国国际收支平衡表、商业银行向中国人民银行缴存的准备金、《中华人民共和国外资金融机构管理条例》中的储备金等都是用的四舍五入。
国内银行计算利息时,分位以下四舍五入。图片来源:张莲苓.商业银行会计(第二版).中国财政经济出版社, 2015
国际上,欧盟委员会对换汇时的舍入规定也是四舍五入。
真正广泛采用银行家舍入法的,是需要更小误差的科学和计算机系统,因此银行家舍入也常常叫做统计学家舍入(statistician's rounding),无偏舍入(unbiased rounding)。
1940年开始,美国材料和试验协会(ASTM)用的就是银行家舍入法。现在大部分编程软件的默认设置都是银行家舍入法,比如C/C++、JavaScript、PHP、Go,英特尔处理器用的也是银行家舍入。
不过,不管是四舍五入还是各种花式舍入法,都无法避免误差累积的问题。我们来看看几个舍入引起的超级乌龙事件。
1982年,加拿大推出了温哥华证券交易所指数VSEI。VSEI 是1500家上市公司的指数合成所得,类似于咱们的上证指数,用来衡量股市的整体走势。
VSEI的初始值是1000点。但是1983年11月,VSEI跌到了524.811点,和一开始相比跌去了近一半。但奇怪的是,构成VSEI的几个股票本身并没有跌这么惨,所以股指到底怎么了呢?
原来,这是舍入误差造成的乌龙。VSEI的计算交由计算机程序自动处理,计算到小数点后第4位。但是,报告中只用了小数点后的3位,最后一位是直接被掐掉的。
因此,每次计算,VSEI的真实值和报告值之间就出现了一个很小但可逐渐累积的误差。而等到1983年11月,这个误差已经壮观到肉眼可见了。
后来,温哥华证券交易所的人花了3周的时间才想明白了重新计算股指的方法。一夜之间,VSEI就从524.811点平白无故地跳到了1098.892点,想想看这让买入指数基金的人有多爽。
舍入误差不光造成金融界的乌龙,还曾造成美军重大伤亡。
海湾战争期间,在沙特的爱国者导弹的计算机精度为24位,有0.0001%的计时误差。运行100小时后,导弹的计算机系统累积了0.3422秒的误差,最终没能拦截伊拉克发射的一枚飞毛腿导弹,造成28名美国陆军死亡。
还有一些人利用舍入的误差攻击金融系统赚钱。
因为日常的金融操作的最小单位是分,也就是小数点后2位,在汇率换算的时候也是如此,有人就想到,可以人为使这个误差朝使自己有利的方向偏移。
举个例子。0.01日元换成美元是0.000093美元,银行不可能把你的钱换没了,所以只能给你0.01美元,这样一来,你就白赚了99.07%。
1分钱虽然是小钱,但苍蝇也是肉,如果循环多次交易,就能利用舍入误差套利。用100日元换1万次,就能赚99美金。
Adrian Furtuna 制造的用于读取银行征信仪器代码的设备。图片来源:BBC
2013年,罗马尼亚计算机安全学家 Adrian Furtuna 发现,欧元在换算成罗马尼亚的货币的过程中可以通过这种方法套利。他就利用外汇舍入的漏洞设计了一款自动赚钱机器。如果能全速运转,这台机器每天就能通过数千次小额交易赚取70欧元。
因为这种交易是在银行设置的合法语境下进行的,所以银行只能吃哑巴亏。银行把这种套利行为取名为“逻辑攻击”(logical attack)。当然,银行也有应对措施,比如收取交易费、设定最小换汇数额,或者限制每日换汇次数等等。
这种对金融系统的攻击,就属于著名的“腊肠术”——神不知鬼不觉地把一片片萨拉米切下来,合起来就是一根完整的腊肠啦。
历史上的确发生过很多次腊肠攻击的案件,不少影视作品也有相应描述,比如1983年的《超人》、1999年的电影《上班一条虫》。
在《上班一条虫》中,男主利用黑客技术篡改了银行的利息算法,把普通储户被四舍五入掉的利息全部转到了他的账户里,超爽der。
腊肠攻击不仅适用于银行,也适用于税务系统。
想想看,如果一家公司有很多员工,把员工交的税分开来计算和合起来计算的数额会因为舍入的问题而略有差异,公司就可以利用多次舍入而少交税。
为了避免有人利用这个漏洞,美国国家税务局就设定了相应的规定(fractions of cents adjustment),使得公司在报税时没有舍入的漏洞可钻。
总之,只有小学生会瞧不起四舍五入,大人都是用它赚钱养小学生。
一个悲伤的悖论:四舍五入有利于储户,而我的1分钱账户却永远没有利息
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.