前言
相信對于四舍五入的舍入法,大家都耳熟能詳,但對于銀行家舍入法,可能就會比較少接觸了!
可是在金融界,銀行家舍入法可是大名鼎鼎的主角之一,主要應用于金融領域和涉及貨幣計算的場合。
那么,這個銀行家舍入法是什么呢?它是怎么來的?有什么規則?……
別急,請聽我一一道來。
銀行家舍入法的來源
銀行的盈利渠道主要是利息差,它從儲戶手里收集資金,然后放貸出去,期間產生的利息差就是銀行所獲得的利潤。
如果采用平常四舍五入的規則,假設采用每 10 筆存款利息計算作為模型,如下:
四舍:0.000、0.001、0.002、0.003、0.004。這些舍的都是銀行賺的錢,
五入:0.005、0.006、0.007、0.008、0.009。這些入的都是銀行虧的錢,
分別為:0.005、0.004、.003、0.002、0.001。
對于銀行來說它的盈利應該是
0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005
從結果中可以看到每 10 筆的利息銀行可能就會損失 0.005 元,千萬別小看這個數字,這對于銀行來說就是一筆非常大的損失。
美國銀行家對金錢是最敏感的,他們首先發現了這個問題,所以他們提出這個算法,用于修正采用上面四舍五入規則而產生的誤差。
銀行家舍入法的規則
銀行家舍入法的規則,簡單地說,就是 四舍六入五成雙
如何理解呢?舉個例子,假設要保留兩位小數,
- 如果第三位小數大于 5,那么進一位,比如 11.556 = 11.56
- 如果第三位小數小于 5,那么舍去,比如 11.554 = 11.55
- 如果第三位小數等于 5,并且有第四位小數,那么進一位,比如 11.5551 = 11.56
- 如果第三位小數等于 5,沒有第四位小數,那么有兩種情況:
- 如果第二位小數是偶數,那么舍去,比如 11.545 = 11.54
- 如果第二位小數是奇數,那么進一位,比如 11.555 = 11.56
如何在程序中實現銀行家舍入法
-
Java 內置了銀行家舍入法的方法,可以直接使用
RoundingMode.HALF_EVEN
來實現,代碼如下:import java.math.BigDecimal; import java.math.RoundingMode;public class Main {public static void main(String[] args) {// 假設要將 2.34567 保留兩位小數double num = 2.34567;BigDecimal bd = new BigDecimal(num);BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_EVEN);System.out.println("使用銀行家舍入法保留兩位小數:" + rounded);} }
-
C# 也內置了銀行家舍入法的方法,可以使用 Math.Round 方法結合 MidpointRounding.ToEven 參數來實現,代碼如下:
using System;class Program {static void Main(){// 定義一個 double 類型的數值double amount = 10.555;// 使用 Math.Round 方法進行銀行家舍入法double roundedAmount = Math.Round(amount, 2, MidpointRounding.ToEven);// 輸出結果Console.WriteLine($"原始數值: {amount}");Console.WriteLine($"銀行家舍入后的結果: {roundedAmount}");} }
總結
這些銀行家們真是精明得很啊,一點虧都不肯吃的 _
往期精彩
- 淺論未來 IT 和財務結合的趨勢
我是老楊,一個奮斗在一線的資深研發老鳥,讓我們一起聊聊技術,聊聊程序人生,共同學習,共同進步