七君
大家在小學就會四舍五入,四及以下被舍去,五以及更大的數(shù)字則進1。
這個規(guī)則在做題的時候沒有什么問題,畢竟做錯做對也不會來錢。那么問題來了,銀行交易的最小單位是分,分以下被約掉的錢雖然不多,但是如果按照我們小學的四舍五入,你和銀行到底誰虧誰賺呢?
舉個例子,比如給5位儲戶的利息分別是0.000元、0.001元、0.002元、0.003元、0.004元,這些厘被四舍五入掉了,因此銀行賺了。
但是另外五位儲戶的利息是0.005元、0.006元、0.007元、0.008元、0.009元,那么他們每人拿到的利息就是0.01元,銀行虧了。
四舍五入過山車
而根據(jù)本福德定律的發(fā)現(xiàn)者弗蘭克·本福德的測算(本福特定律,也稱為本福德法則,從實際生活得出的數(shù)據(jù)中,以1為首位數(shù)字的數(shù)的出現(xiàn)幾率約為總數(shù)的三成,接近期望值1/9的3倍。推廣來說,越大的數(shù),以它為首位的數(shù)出現(xiàn)的幾率就越低。它可用于檢查各種數(shù)據(jù)是否有造假),非第一位的數(shù)基本上符合隨機分布,也就是0-9這10個數(shù)字出現(xiàn)的概率相同。那么每付出10筆利息,銀行的總收益就是:
0.000+0.001+0.002+0.003+0.004-0.005-0.004-0.003-0.002-0.001=-0.005
看到了吧,妥妥的虧錢。這還只是付10筆利息的情況,銀行有上百萬上千萬的儲戶,那么虧損就更大了,每千萬筆利息,銀行要虧五千元。
也就是說,四舍五入其實不利于銀行,而有利于儲戶。
話說回來,傳統(tǒng)的四舍五入讓銀行虧錢的原因是因為把5都往大了算。為了減小誤差,有人設計出了一種叫做銀行家舍入(Bankers Rounding)的算法。它的規(guī)則是這樣的:
* 4及以下直接舍去;大于等于6時,進位后舍去;這兩點和四舍五入一樣;
* 5的情況比較復雜,如果5后面還有數(shù)字,則進位后舍去;如果5后面沒有數(shù)字了,那么5前面是奇數(shù),則進1,若5前面是偶數(shù)直接舍去5。
舉幾個例子:
3.016 ≈ 3.02
3.013 ≈ 3.01
3.015 ≈ 3.02
3.045 ≈ 3.04
3.04501 ≈ 3.05
國內(nèi)銀行計算利息時,分位以下四舍五入@張蓮苓《商業(yè)銀行會
如果數(shù)字隨機分布,則銀行家舍入引起的誤差比傳統(tǒng)的四舍五入小,因為銀行家舍入法在計算時,平均一半的情況數(shù)會變大,而另一半會變小。當然,銀行家舍入也不是完全沒有誤差,其誤差和操作次數(shù)的平方根成正比。
不過需要指出的是,雖然這種舍入法叫“銀行家舍入”,但實際上和銀行關系不大。
我國金融系統(tǒng)的大部分算法就是用四舍五入。比如分以下的利息、中國國際收支平衡表、商業(yè)銀行向中國人民銀行繳存的準備金、《中華人民共和國外資金融機構(gòu)管理條例》中的儲備金等都是用的四舍五入。
國際上,歐盟委員會對換匯時的舍入規(guī)定也是四舍五入。
真正廣泛采用銀行家舍入法的,是需要更小誤差的科學和計算機系統(tǒng),因此銀行家舍入也常常叫做統(tǒng)計學家舍入(statisticians rounding)、無偏舍入(unbiased rounding)。
1940年開始,美國材料和試驗協(xié)會(ASTM)用的就是銀行家舍入法。現(xiàn)在大部分編程軟件的默認設置都是銀行家舍入法,比如C/C++、JavaScript、PHP、Go,英特爾處理器用的也是銀行家舍入。
編程中銀行家舍入用得最多
不過,不管是四舍五入還是各種花式舍入法,都無法避免誤差累積的問題。我們來看看幾個舍入引起的超級烏龍事件。
1982年,加拿大推出了溫哥華證券交易所指數(shù)VSEI。VSEI 是1500家上市公司的指數(shù)合成所得,類似于咱們的上證指數(shù),用來衡量股市的整體走勢。
VSEI的初始值是1000點。但是1983年11月,VSEI跌到了524.811點,和一開始相比跌去了近一半。奇怪的是,構(gòu)成VSEI的各個股票本身并沒有跌這么慘,所以股指到底怎么了呢?
原來,這就是舍入誤差造成的烏龍。VSEI的計算交由計算機程序自動處理,計算精確到小數(shù)點后4位。但是,報告中只用小數(shù)點后3位,最后一位是直接被舍掉的。
因此,每次計算,VSEI的真實值和報告值之間就出現(xiàn)了一個很小但卻逐漸累積的誤差。而到1983年11月,僅僅一年多時間這個誤差已經(jīng)壯觀到肉眼可見了。
后來,溫哥華證券交易所的人花了3周的時間才想明白了重新計算股指的方法。一夜之間,VSEI就從524.811點跳到了1098.892點,想想看這讓買入指數(shù)基金的人有多爽。
舍入誤差不光造成金融界的烏龍,還曾造成美軍重大傷亡。海灣戰(zhàn)爭期間,在沙特的愛國者導彈的計算機精度為24位,有0.0001%的計時誤差。運行100小時后,導彈的計算機系統(tǒng)累積了0.3422秒的誤差,最終沒能攔截伊拉克發(fā)射的一枚飛毛腿導彈,造成28名美國陸軍士兵死亡。
還有一些人利用舍入的誤差攻擊金融系統(tǒng)賺錢。
因為日常的金融操作的最小單位是分,也就是小數(shù)點后2位,在匯率換算的時候也是如此,有人就想到,可以人為使這個誤差朝使自己有利的方向偏移。
愛國者導彈發(fā)射
舉個例子。0.01日元換成美元是0.000093美元,銀行不可能把你的錢換沒了,所以只能給你0.01美元,這樣一來,你就白賺了99.07%。
1分錢雖然是小錢,但蒼蠅也是肉,如果循環(huán)多次交易,就能利用舍入誤差套利。用100日元換1萬次,就能賺99美金。
2013年,羅馬尼亞計算機安全學家阿德里安·富圖納(Adrian Furtuna) 發(fā)現(xiàn),歐元在換算成羅馬尼亞貨幣列伊的過程中可以通過這種方法套利。他就利用外匯舍入的漏洞設計了一款自動賺錢機器。如果能全速運轉(zhuǎn),這臺機器每天就能通過數(shù)千次小額交易賺取70歐元。
Adrian Furtuna 制造的用于讀取銀行征信儀器代碼的設備。@BBC
因為這種交易是在銀行設置的合法語境下進行的,所以銀行只能吃啞巴虧。銀行把這種套利行為取名為“邏輯攻擊”(logical attack)。當然,銀行也有應對措施,比如收取交易費、設定最小換匯數(shù)額,或者限制每日換匯次數(shù)等等。
這種對金融系統(tǒng)的攻擊,就屬于著名的“臘腸術(shù)”——神不知鬼不覺地把一片片薩拉米切下來,合起來就是一根完整的臘腸啦。
歷史上的確發(fā)生過很多次臘腸攻擊的案件,不少影視作品也有相應描述,比如1983年的《超人》、1999年的《上班一條蟲》。
在《上班一條蟲》中,男主利用黑客技術(shù)竄改了銀行的利息算法,把普通儲戶被四舍五入掉的利息全部轉(zhuǎn)到了他的賬戶里。
臘腸攻擊不僅適用于銀行,也適用于稅務系統(tǒng)。
想想看,如果一家公司有很多員工,把員工交的稅分開來計算和合起來計算的數(shù)額會因為舍入的問題而略有差異,公司就可以利用多次舍入而少交稅。
為了避免有人利用這個漏洞,美國國家稅務局就設定了相應的規(guī)定(fractions of cents adjustment),使得公司在報稅時沒有舍入的漏洞可鉆。
總之,只有小學生會瞧不起四舍五入,大人都是用它賺錢養(yǎng)小學生。
一個悲傷的悖論:四舍五入有利于儲戶,而我的1分錢賬戶卻永遠沒有利息。
(本文經(jīng)授權(quán)轉(zhuǎn)載自“把科學帶回家”微信公眾號,有刪節(jié))