本文筆者将從兩個層面,講述:在做财務系統時遇到的關于小數精度的問題,該如何解決?
最近在做财務系統中遇到一個關于小數精度的問題:
我們知道計算機在訂單結算信息的時候,是通過單條訂單計算結算金額,然後整體彙總再給出結果。這樣才能支持業務上需要從不同時間維度彙總數據的要求(每3天一結算,每7天一結算,每月一結算等)。但是,作為一個正常用戶,我們并不會這麼去計算,我們采用的是先彙總商品價格再計算結算金額的方法,如下方展示:
結算公式: 應結算金額 = 商品價格-商品價格*傭金比例
計算機: 計算訂單1的應結算金額J1,計算訂單2的應結算金額J2,計算訂單3的應結算金額J3,然後彙總。
人工計算:計算訂單1,訂單2,訂單3的商品價格彙總,再按照總的商品價格計算應結算金額。
我們剛開始對計算機計算的每一個J1,J2,J3都采取四舍五入的方法,發現最後和人工核對時算出的結果是不一樣的,會有精度上的誤差。計算機彙總的結果可能是4.56,而人工算的是4.57,那麼怎麼辦呢?
要從兩個層面解決這個問題
1. 系統層面
- 改造計算系統的規則,舍棄2位小時的方式改為采用4位小數的方式計算具體金額。
- 更改數據修約的規則,舍棄四舍五入的方法,改為采用四舍六入五成雙法,關于四舍六入五成雙法在後面給出說明。
2. 展現層面
- 在後台展現4位精度。
- 在用戶餘額等和外部系統有資金交互的地方隻展示2位小數,采用向下取整的方法(4.5667取4.56)保證系統不會多付錢給用戶。
通過以上方法,我們保證了整個财務系統精度符合業務要求,能夠正常運作。
四舍六入五成雙法
1. 含義
對于位數很多的近似數,當有效位數确定後,其後面多餘的數字應該舍去,隻保留有效數字最末一位。這種修約(舍入)規則是“四舍六入五成雙”,也即“4舍6入5湊偶”。
這裡“四”是指≤4 時舍去,”六”是指≥6時進上,”五”指的是根據5後面的數字來定,當5後有數時,舍5入1;當5後無有效數字時,需要分兩種情況來講:
- 5前為奇數,舍5入1;
- 5前為偶數,舍5不進(0是偶數)。
2. 為什麼要這樣做?
從統計學的角度,“四舍六入五成雙”比“四舍五入”要科學,在大量運算時,它使舍入後的結果誤差的均值趨于零,而不是像四舍五入那樣逢五就入,導緻結果偏向大數,使得誤差産生積累進而産生系統誤差,“四舍六入五成雙”使測量結果受到舍入誤差的影響降到最低。
本文由@shinian 原創發布于人人都是産品經理,未經許可,禁止轉載
題圖來自Unsplash, 基于CC0協議
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!