7種常見“小數處理”模型
在交易范疇和支付范疇里面,我們常常會發現小數除不盡的情況。本文總結了7種常見“小數處理”模型,供大家在實際場景中選擇合適的模型。
在交易范疇和支付范疇經常出現小數除不盡,或者乘數結果小數位數太多的情況,需要對小數進行處理因為,數據庫存儲小數,往往會設定位數或者最小單位,例如保留兩位小數,或者金額的最小單位為分,數值只能為整數。
常見的業務有以下這些:
- 交易范疇的優惠分攤金額的小數處理
- 支付范疇的多次分賬每次分賬金額的小數處理
- 收款手續費處理
- 多次退款的手續費處理
- 利息的處理
一、除不盡的場景
分攤時,如一筆訂單優惠10元,分攤到3個商品上,那么每個商品分攤多少,很明顯10?3=3.333…是除不盡的,這時候最終每個商品分攤了多少優惠?分賬時,如一筆收款100塊,現在要平均分賬7筆,每筆應該分多少錢,這里100?7=14.2857143…,那么如何執行分賬?
二、相乘位數增加的場景
計算手續費時,例如手續費率0.38%,一筆收款568元,此時應收手續費568*0.38%=2.158假如需要保留兩位小數,那么最終手續費收多少呢?這里的規則需要跟商戶預先約定方法不重要,重要的是共識,沒有合不合理,只有愿不愿意。
大原則肯定是“公平”,何為公平就是“不多付一分錢,不少收一分錢,剛剛好”,而出現小數要處理也是迫不得已,那么也要盡可能保證公平,如果實在是做不到絕對公平,那么就做到各方共識,都能接受。
下面總結了7種常見的小數處理方法,以及適用的場景,全部以保留2位小數為前提。
1. 去尾法
保留位數后的值直接舍去,這個方法會讓數偏小可以用在“不能高于”的限制場景,比如多次分賬,不能超過總分賬金額,那么前面的分賬都可以直接去尾,最后進行調整示例:
568*0.38%=2.159,去尾以后為2.15像銀行給客戶的利息可以考慮去尾法,這樣整體來說,可以降低銀行的資金成本另外我們日常買東西也經常用去尾法,比如買菜,一共2.53,你可能會說“老板,零頭別要了”,直接2.5就可以了。
2. 進一法
只要保留位數以后有數值,則直接進一,數會偏大可以在“不低于的“限制場景使用,比如你去給領導買可樂,一共8個領導,每人一瓶;假如一箱共6瓶可樂,那么8?6=1.3333…,只能買2箱(不零賣)示例:568*0.38%=2.151,有數則進1,處理后結果為2.16
3. 四舍五入
這是最常見的處理方法,整體數值會偏大,小于5時舍去,大于等于5時進一像微信的交易收款手續費采用的就是“四舍五入法”示例:568*0.38%=2.158,8大于5直接進1,為2.16
4. 四舍六入五成雙
該方法比“四舍五入”更精確,當數據量大時結果更接近真實數值因為1、2、3、4、5、6、7、8、9中,5正好在中間位置,如果四舍五入,很明顯進一的場景要比舍去的場景多“1”那么為了更公平就以5為分界線,小于5舍去,大于5進1,而當等于5時分情況處理如果5后還有數則進1,例如2.12500009,因為5后還有數,那么就進1,結果為2.13如果5后沒有數了,要看5前面的數是奇數還是偶數,奇數時舍5進1,偶數時舍5不進(0為偶數),例如:2.175,5前面的“7”是奇數,則舍5進1,結果為2.182.165,5前面的“6”是偶數,則舍5不進,結果為2.16
5. 余數分配,補差法
當除不盡時,對余數設定分配策略,先處理除盡的部分,最后補全差額,這樣的方法會讓個別有誤差,但整體沒有誤差例如開頭的分攤例子:
一筆訂單優惠10元,分攤到3個商品上,那么每個商品分攤多少,很明顯10?3除不盡,整數結果是3,余數是1,那么2個商品分攤3,另一個分攤4如果保留2位小數,則10?3=3.333333…,其中2個商品分攤3.33,最后一個商品分攤10-3.33-3.33=3.34該方法可以用于優惠分攤和分賬,包括退款手續費的處理,微信的退款手續費規則中有該方法余數分配方法可以與其他方法聯合使用,以確保最終的公平性例如微信多次退款時的手續費處理,前面按照“向下取整”的策略,而最后一次退款退回全部手續費,實際上就是對余數進行補齊的策略,雖然前面手續費少退了,但是最后全給你補上了
6. 向上取整
有數值則進1,這樣會讓數值偏大,但在最后一次進行調整,保證整體無誤差,如微信支付在規則調整前部分退款的手續費是“向上取整”,這樣就意味著多次退款時,前面返給商家的手續費偏高示例:2.12100009,向上取整則結果為2.13,看起來和進一法效果類似
7. 向下取整
與向上取整向反,直接舍去,跟去尾法相似目前微信支付多次退款的手續費退回處理策略是“向下取整”微信支付采用了多種小數處理策略,交易手續費采用“四舍五入”,多次退款時采用“向下取整+余數補齊”例如開頭的交易示例:手續費率0.38%,一筆收款568元,此時應收手續費568*0.38%=2.158,“四舍五入”以后為2.16如果全額退款直接退2.16即可如果是部分時,退款手續費計算規則是:
退款手續費=退款金額/總金額*交易手續費
- 假如第一次退款268元,則268/568*2.16=1.019=1.01(向下取整)
- 第二次退款169元,則169/568*2.16=0.642=0.64(向下取整)
- 第三次退131元,即退剩下的全部,則應退手續費2.16-1.01-0.64=0.51(余數分配,調整差額)
最后,實際工作中可以根據實際業務情況靈活選擇和組合,或者設計出更優的模型出來,例如“平常向下取整,年終一次性補齊整體差額”等,以確保盡可能的公平和大家都能接受的模型執行。
專欄作家
陳天宇宙,微信公眾號:陳天宇宙,人人都是產品經理專欄作家。多平臺支付領域專欄作者,十年資深產品;專注為10萬支付產品經理和支付機構以及企業提供深度支付內容和服務!
本文原創發布于人人都是產品經理,未經許可,禁止轉載。
題圖來自 Unsplash,基于 CC0 協議。
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。
- 目前還沒評論,等你發揮!