考虑交易手续费的等额支付拆分计算逻辑与代码实现
带交易手续费的等额分账计算方案
规则前提
本计算基于通用转账手续费规则:手续费由发起方(参与方1)承担,即发起金额为
t的转账时,收款方全额到账t,发起方账户累计扣减金额为t + t*1.9% + 0.1 = 1.019t + 0.1。如果业务为手续费从转账金额内扣,只需调整方程参数,核心逻辑通用。
计算思路
- 设5名参与方最终相等的账户余额为
x - 其余4名参与方无转出操作,仅收到1笔转账,因此每人收到的转账金额等于最终余额
x,即每笔转账的提交金额为x - 参与方1初始持有1000美元,共发起4笔等额转账,总扣减金额为
4*(1.019x + 0.1) - 参与方1最终余额 = 初始资金 - 总扣减金额,该值必须等于
x,据此列一元一次方程:x = 1000 - 4*(1.019x + 0.1) - 移项求解得:
x = (1000 - 4*0.1) / (1 + 4*1.019) ≈ 196.93美元 - 因货币最小单位为0.01美元,四舍五入产生的小额尾差(通常不超过2美分)默认由发起方承担,符合常规分账业务规则。
代码实现参考(Python)
from decimal import Decimal, ROUND_HALF_UP # 场景参数 用Decimal做高精度计算避免浮点误差 TOTAL_AMOUNT = Decimal("1000.0") USER_COUNT = 5 TRANSFER_COUNT = USER_COUNT - 1 FEE_RATE = Decimal("0.019") FIXED_FEE = Decimal("0.1") CENT = Decimal("0.01") # 求解无精度损失的人均金额 per_amount = (TOTAL_AMOUNT - TRANSFER_COUNT * FIXED_FEE) / (1 + TRANSFER_COUNT * (1 + FEE_RATE)) # 转账金额保留到分,四舍五入 per_transfer = per_amount.quantize(CENT, rounding=ROUND_HALF_UP) # 计算发起方实际总扣减 total_deduct = TRANSFER_COUNT * (per_transfer * (1 + FEE_RATE) + FIXED_FEE) sender_final = (TOTAL_AMOUNT - total_deduct).quantize(CENT, rounding=ROUND_HALF_UP) print(f"每笔向其他参与方的转账金额:{per_transfer} 美元") print(f"4名收款方最终到账余额:{per_transfer} 美元/人") print(f"参与方1(发起方)最终余额:{sender_final} 美元") print(f"尾差说明:最大差额不超过0.02美元,由发起方承担,符合业务要求")
运行输出参考
每笔向其他参与方的转账金额:196.93 美元 4名收款方最终到账余额:196.93 美元/人 参与方1(发起方)最终余额:196.91 美元 尾差说明:最大差额不超过0.02美元,由发起方承担,符合业务要求
如果要求5人余额完全无差额,可直接使用无精度截断的per_amount值(约196.9267美元)作为转账金额即可,仅适用于无最小货币单位限制的账户体系。
内容的提问来源于stack exchange,提问作者Ave B
相关产品推荐
相关产品推荐

