2009年5月22日 星期五

四捨五入

日前有報章報導,東亞銀行的網上系統有漏洞,只要不斷透過四捨五入造成的誤差,便可安坐家中賺取利潤。本文談談「四捨五入」這個數學上常用的取近似值的方法。

四捨五入的原理很簡單,基本上就是「向較接近的一方取近似值,以減少誤差」。例如,要把123.456 取小數點後一位的近似值,則因為 123.456 界乎 123.4 和 123.5 之間,而且較接近後者,因此我們取 123.5 作為近似值。

這裡有一個小問題,就是「較接近的一方」並不一定存在,例如把 123.450 捨入至 123.4 和 123.5 都是「同樣接近」的,故此我們根據「五入」的規則,把 123.450 向上捨入至 123.5。但這樣做的話得出的近似值會偏大。如果只是把 123.450 變成 123.5 當然問題不大,不過如果是 1.5 變 2,或 10.5 變 11 的話,而且經常要「五入」的話(這樣的例子是存在的,例如以 0.5 分為評分單位但最終分數必定是整數的考試),那就很不同了。

為了解決這個「偏大」的問題,一個「修正版」的四捨五入法是「四捨六入五留雙(banker's rounding)」。名字本身有點誤導:雖然叫「六入」,但其實是「(5+ε)入」,例如 123.456 仍會「(5.6)入」至 123.5。只是當出現 123.450 這些「打和」的情況時,才採用「五留雙」的規則:如果 5 字前的位是雙數則保留,單數則進位,故基於「4」是雙數,123.450 會向下捨入至 123.4,而 123.550 則會上捨入至 123.6。至於「banker」是否真的採用此規則,大家不妨測試一下。

那麼為甚麼要「留雙」而不是「留單」呢?我有以下猜測。在以上 123.456 的例子中,如果採用四捨五入法取小數點後一位的近似值,則會變成 123.5,如果再把近似值取最接近整數,則變成 124。問題是最接近 123.456 的整數應是 123 才對。再細看一下,我們發現其實 123.44...445 已經可以「合法地」變成 124:只要逐位「五入」即可,而且即使採用「四捨六入五留單」,同樣的情況仍會發生。採用「五留雙」的話,這樣的情況會得到一點點的改善(雖然也好不到哪裡):123.4500...001 才可以「合法地」變成 124!

沒有留言: