微信退款手续费规则:
应退还手续费金额 = ROUND((本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))
ROUND(x)使用银行家算法进行舍入到分。
我们测试过程中使用了如下的测试用例:
结算金额为8.50元,共分10笔进行退款,每笔为0.85元。
之后我们对公式内的数据分段进行计算,发现了一个可疑点。
之后开始怀疑计算机的浮点存储方式导致精度问题。
方式一
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(本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))