接口传 0.1 存进数据库变成 0.1000000000000000055511151231257827,对账时金额差出一截。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,new BigDecimal(double) 把二进制浮点的误差原样搬进来,得到的并不是十进制的 0.1。

「BigDecimal 构造」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。

new BigDecimal('0.1')
BigDecimal.valueOf(0.1)
# 两个写法内部都按十进制字符串处理

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,构造改用字符串形式;入参金额声明成 String 或 BigDecimal;落库前统一 setScale 定精度。

最后用这个标准收尾,存进去的金额是 0.10,和账单逐条都能对上。

作者 9823189