今天在 SegmentFault 看到了類似問題宁否,查資料回答那個問題后窒升,決定留個筆記。
我們在計算金額時慕匠,難免存在保留位數(shù)有限饱须,計算結果需要取舍的情況。往往在電商台谊、銀行系統(tǒng)中蓉媳,金額是以整數(shù)形式保存,單位為貨幣最小單位锅铅,例如分酪呻。但是在結算時額外的參數(shù)如折扣、利率盐须、稅率等存在著大量的浮點數(shù)玩荠,計算結果則需要轉換為整數(shù)。
簡單處理一般是四舍五入贼邓,但是這樣存在很明顯的問題阶冈,就是 “入” 的概率大于 “舍”,明顯的塑径,遇到 1女坑、2、3统舀、4 舍匆骗,遇到 5、6誉简、7绰筛、8、9 入描融,粗看這種就可以發(fā)現(xiàn)問題铝噩。如果想要兩邊平衡,則 “四舍六入” 才是合理的,但是骏庸,5 怎么辦毛甲?
有趣的推理
轉自知乎用戶給出的一個例子(原知乎答案地址:https://www.zhihu.com/question/28943072/answer/42673180)
某實數(shù) r = 0.4445。也就是說具被,比九分之四稍微大一點點玻募。(構造其他小數(shù)也可以,有限小數(shù)還是無限小數(shù)一姿、純小數(shù)還是帶小數(shù)都沒關系)
好了七咧,根據(jù)四舍五入算法 f,直接把這個 r 保留到整數(shù)叮叹。那么艾栋,明顯,結果是 0蛉顽,小數(shù)點后第一位是 4 么蝗砾。
這時,請開放一下腦洞携冤。有一群科學家拿到了這個數(shù)字悼粮。然后……
科學家 s3 把 r 保留到小數(shù)點后第 3 位,得 r3 = 0.445曾棕。第 4 位是 5 么扣猫,按四舍五入的精神,把這個 1 進到第 3 位翘地,使之變成 5申尤。
科學家 s2 把 r 保留到小數(shù)點后第 2 位,得 r3 = 0.45子眶。第 3 位是 5 么瀑凝,按四舍五入的精神,把這個 1 進到第 2 位臭杰,使之變成 5粤咪。
科學家 s1 把 r 保留到小數(shù)點后第 1 位,得 r1 = 0.5渴杆。第 2 位是 5 么寥枝,按四舍五入的精神,把這個 1 進到第 1 位磁奖,使之變成 5囊拜。
科學家 s0 把 r 保留到小數(shù)點后第 0 位,得 r0 = 1比搭。第 1 位是 5 么冠跷,按四舍五入的精神,把這個 1 進到第 0 位,使之變成 1蜜托。
最終結果和 0.4445 直接四舍五入結果存在明顯差異抄囚。
還有個例子也能說明:
2.55 + 3.45 = 6
如果我們把 2.55 和 3.45 四舍五入保留一位小數(shù),那么上述式子就成了:
2.6 + 3.5 = 6.1
這樣的問題非常常見橄务,也導致了在大量樣本中幔托,四舍五入后計算結果的總和會明顯大于直接計算總和的結果,對于金融單位計算利息而言蜂挪,這樣很顯然是一個虧本的行為重挑。如果不虧本的算,依舊是簡單處理可能結果相反棠涮,那么客戶就不開心了谬哀。
銀行家舍入(Banker's Round)
亦叫做 “四舍六入五成雙” ,四舍六入故爵,使得兩頭(即進和舍)概率相等玻粪,但是隅津,在 4 和 6 之間的 5 就需要特別對待诬垂。具體規(guī)則如下:
舍去位的數(shù)值小于5時,直接舍去伦仍;
舍去位的數(shù)值大于等于6時结窘,進位后舍去;
當舍去位的數(shù)值等于5時充蓝,分兩種情況:5后面還有其他數(shù)字(非0)隧枫,則進位后舍去;若5后面是0(即5是最后一位)谓苟,則根據(jù)5前一位數(shù)的奇偶性來判斷是否需要進位官脓,奇數(shù)進位,偶數(shù)舍去涝焙。
舍去位卑笨,當小于 5,即 0 ~ 4.999999…… 則舍去仑撞,大于 6赤兴,即 6 ~ 10 則進位,則中間區(qū)間那個數(shù)字隧哮,5 ~ 5.999999…… 桶良,只要使該區(qū)間內存在的數(shù)字平均分布,即可保證取舍概率相等沮翔。于是得到上述算法陨帆。
按上述規(guī)則,之前的 2.55 + 3.45 = 6 得出的結果如下:
2.6 + 3.4 = 6
結果正確。
轉載 :https://www.insp.top/article/how-to-ensure-accurate-for-digital-transformation