数据库读出来的 1.00 和代码里 new 的 1.0 用 equals 比较返回 false,金额校验被判成不一致,调用方直接拒绝。日志里能对上时间点,这种反而好排。

equals 连 scale 一起比较,1.0 和 1.00 标度不同就算不相等,判断金额大小要用 compareTo。这一点先确认清楚,后面就不用反复试。

a.compareTo(b) == 0
a.setScale(2, RoundingMode.HALF_UP)

「BigDecimal 比较」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:相等判断改成 compareTo 返回 0;集合去重前统一 setScale;金额入库前固定两位小数。

结果对不对很好判断,1.0 与 1.00 比较结果为相等,去重也不再出现重复项。

作者 9823189