微信支付-退款手续费问题排查

微信退款手续费规则:

应退还手续费金额 = ROUND((本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))

ROUND(x)使用银行家算法进行舍入到分。

我们测试过程中使用了如下的测试用例:

结算金额为8.50元,共分10笔进行退款,每笔为0.85元。


微信支付-退款手续费问题排查_第1张图片
我们发现在第5笔和第6笔产生了差异

之后我们对公式内的数据分段进行计算,发现了一个可疑点。

微信支付-退款手续费问题排查_第2张图片
第5笔计算出来的数据不是0.005,而是比0.005略大产生了精度问题

之后开始怀疑计算机的浮点存储方式导致精度问题。

方式一

double tmp = 0.05/3*3;

tmp为0.05。

方式二

double tmp1 = 0.05/3;

double tmp2 = tmp1*3;

tmp2为0.05。

本来我以为方式二会产生精度的问题,但是并没有能复现问题。至此问题排查陷入了僵局。

最终微信方面反馈,确实是精度问题。问题也定位在了一样的位置,因为开发同学多进行了一步ROUND运算。

原公式:

ROUND((本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))

开发同学实现的公式:

ROUND(ROUND(本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))

你可能感兴趣的:(微信支付-退款手续费问题排查)