支付系统中财务相关数据类型使用BigDecimal,比如支付宝、微信的费率,实际使用过程我们可能会出现部分退费的场景,通过退费数据比例获取部分退费的费率,会通过获取数据精度的方式拿到大致准确的费率
// 0.9067 通过退款金额和支付金额计算出来的比例
BigDecimal refundRate = new BigDecimal(0.9067);
// 计算出来的退款比例乘以费率3%,获取四位精度,保留2位精度数据
long value = refundRate.multiply(new BigDecimal(3)).setScale(2, BigDecimal.ROUND_HALF_UP).longValue();
refundRate.multiply(new BigDecimal(3)).setScale(2, BigDecimal.ROUND_HALF_UP)
计算出来的结果是2.99,取longValue()得到2,和实际费率3区别很大,没有实际上做四舍五入
修改后的代码如下:
// 0.9067 通过退款金额和支付金额计算出来的比例
BigDecimal refundRate = new BigDecimal(0.9067);
// 计算出来的退款比例乘以费率3%,获取四位精度,保留0位精度数据
long value = refundRate.multiply(new BigDecimal(3)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();