from decimal import Decimal
fen=1999
print((Decimal(fen)/100).quantize(Decimal('0.01')))
订单金额 1999 分,代码写成 amount/100,传给支付宝时报 Invalid Amount,日志里打印的值是 19.990000000000002。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,除法和浮点表示都会引入误差,支付渠道对金额做正则校验,只接受最多两位小数。转成字符串后多出来的尾数直接触发参数校验失败。
围绕「分转元精度」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:分转元用 Decimal 或整数拼接字符串 别用浮点除法;输出前 quantize 到两位并转成字符串;对账时以分为主键单位 元只做展示;金额字段在 DTO 里声明成字符串或 long。
改完只确认一件事:1999 分输出 19.99 支付接口返回成功 不再报金额格式错误。
