微信退款手续费规则:
应退还手续费金额 = ROUND((本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))
ROUND(x)使用银行家算法进行舍入到分。
我们测试过程中使用了如下的测试用例:
结算金额为8.50元,共分10笔进行退款,每笔为0.85元。
我们发现在第5笔和第6笔产生了差异之后我们对公式内的数据分段进行计算,发现了一个可疑点。
第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(本次退款实际有效退款金额/(已结算金额-已结算已退款金额))*(已收取手续费-已退款手续费))
网友评论