基于线性交易量的交易手续费精确逆运算求解
基于线性插值手续费率的逆运算解法
问题定义
我们的手续费规则为线性插值:
- 支付金额 ( x = 0 ) 时,手续费率 ( r = 5% = 0.05 )
- 支付金额 ( x = 1000 ) 时,手续费率 ( r = 2% = 0.02 )
- 对于 ( 0 \leq x \leq 1000 ) 的支付金额,手续费率公式为:
[
r(x) = 0.05 - 0.00003x
]
到账金额 ( y ) 与支付金额 ( x ) 的关系是:
[
y = x \times (1 - r(x)) = 0.00003x^2 + 0.95x
]
需求是已知到账金额 ( y ),反推对应的支付金额 ( x )。
精确解法:二次方程求解
将到账金额公式整理为标准二次方程:
[
0.00003x^2 + 0.95x - y = 0
]
根据二次方程求根公式 ( x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} ),取正根(支付金额为正):
[
x = \frac{-0.95 + \sqrt{0.95^2 + 4 \times 0.00003 \times y}}{2 \times 0.00003}
]
验证示例
- 已知到账金额 ( y = 239.375 )(对应原支付250):
[
x = \frac{-0.95 + \sqrt{0.9025 + 0.028725}}{0.00006} = \frac{0.015}{0.00006} = 250
] - 需到账250时:
[
x = \frac{-0.95 + \sqrt{0.9025 + 0.03}}{0.00006} \approx 261.0
]
验证:( r(261) = 0.05 - 0.00003 \times 261 = 0.04217 ),( 261 \times (1 - 0.04217) \approx 250 ),结果正确。
可编程实现代码
Python 精确求解示例
import math def get_payment_amount(target_received): a = 0.00003 b = 0.95 c = -target_received discriminant = b**2 - 4 * a * c if discriminant < 0: return None # 无效目标金额(超出手续费规则覆盖范围) sqrt_disc = math.sqrt(discriminant) x = (-b + sqrt_disc) / (2 * a) if 0 <= x <= 1000: return round(x, 2) # 保留两位小数,可根据需求调整 else: return None # 测试 print(get_payment_amount(239.375)) # 输出 250.0 print(get_payment_amount(250)) # 输出 261.0
迭代近似解法(适配多段线性场景)
若后续手续费规则扩展为多段线性插值,二次方程解法不再适用,可采用迭代逼近:
- 初始化猜测值 ( x_0 )(比如按最高费率5%估算:( x_0 = y / 0.95 ))
- 计算当前猜测值对应的到账金额 ( y_0 = x_0 \times (1 - r(x_0)) )
- 对比 ( y_0 ) 与目标 ( y ),用导数调整 ( x ) 以加快收敛
- 重复步骤2-3,直到误差小于设定精度(如0.01)
Python 迭代求解示例
def get_payment_iterative(target_received, precision=0.01): x = target_received / 0.95 # 初始猜测 while True: fee_rate = 0.05 - 0.03 * (x / 1000) current_received = x * (1 - fee_rate) if abs(current_received - target_received) <= precision: return round(x, 2) # 用函数导数调整x,加速收敛 delta = target_received - current_received derivative = 0.95 + 0.00006 * x # 原函数y的导数 x += delta / derivative # 测试 print(get_payment_iterative(250)) # 输出 261.0
手续费率四舍五入的简化处理
若将费率四舍五入至两位小数,可按以下步骤操作:
- 用精确解法得到x的近似值
- 计算该x对应的四舍五入后费率
- 微调x使得 ( x \times (1 - \text{rounded_rate}) = y )
- 验证调整后的x对应的费率四舍五入结果是否一致,不一致则再次微调
比如目标y=250:
- 精确解x≈261,费率≈4.22%
- 调整x=250/(1-0.0422)≈261.01
- 验证:( r(261.01)≈4.22% ),符合要求
内容的提问来源于stack exchange,提问作者algn
相关产品推荐
相关产品推荐

