Python 代码不报错,结果却不对?用 AI 定位字符串乘法问题
摘要
Python 程序能运行,不代表计算结果正确。通过一个订单金额计算示例,演示如何整理复现代码、向 AI 提供有效上下文,并用断言验证修复结果。附可直接复制的排错提示词。
订单金额为什么变成了重复字符串
假设你正在处理一条订单数据:单价 19.90 元,数量 2,预期总额是 39.80 元。
代码写起来很简单:
importjson raw='{"price": "19.90", "quantity": 2}'order=json.loads(raw)total=order["price"]*order["quantity"]print(total)运行后却得到:
19.9019.90没有异常,也没有报错提示,但结果明显不符合业务要求。
这里的price是字符串,quantity是整数。Python 中,字符串乘以整数会重复字符串,因此"19.90" * 2得到的是两个字符串拼在一起。参考 Python 序列操作文档。
这类问题交给 AI 排查时,最有用的信息就是实际输入和预期结果。
先把问题缩小到能够复现
不要直接贴整个项目,再补一句“帮我看看哪里有问题”。先保留能复现错误的代码,去掉数据库连接、网络请求和无关函数。
上面的十行代码已经足够说明问题。还可以临时增加类型检查:
print(type(order["price"]).__name__)print(type(order["quantity"]).__name__)输出:
str int这一步给排查提供了具体证据,也能避免 AI 在没有依据时猜测缓存、接口或数据库问题。
可以直接复制的 AI 排错提示词
请帮我排查下面的 Python 代码。 业务目标: 计算订单总额,单价 19.90 元,数量 2, 预期输出 39.80。 实际结果: 输出了 19.9019.90,没有抛出异常。 输入数据: {"price": "19.90", "quantity": 2} 相关代码: [在这里粘贴最小复现代码] 请按以下顺序回答: 1. 结合输入值和变量类型解释原因。 2. 给出最小修改方案,不重构无关代码。 3. 考虑金额计算,解释数据类型的选择。 4. 给出验证修复结果的断言。 5. 单独列出示例尚未覆盖的异常输入。 没有提供的信息请明确指出,不要自行假设。在自己的问题中,还应补充实际 Python 版本和相关依赖版本。提交代码前,删掉密钥、客户资料和内部地址;样例数据只要保留原有结构与类型即可。
用 Decimal 修复,并验证结果
这个示例可以将单价字符串转换为Decimal,再进行计算:
importjsonfromdecimalimportDecimal raw='{"price": "19.90", "quantity": 2}'order=json.loads(raw)price=Decimal(order["price"])quantity=order["quantity"]total=price*quantityasserttotal==Decimal("39.80")print(f"{total:.2f}")输出:
39.80Decimal可以准确表示这里的十进制金额。直接从原始字符串构造,也避免了先转换为二进制浮点数再转换回来。参考 Python Decimal 文档。
修复后,要检查计算值,不能只看打印结果。这里的断言用于确认结果确实等于39.80;生产环境的数据校验应使用明确的判断和异常处理,不能依赖可能被优化选项禁用的断言。
示例假设单价是合法的金额字符串、数量是整数。接入真实接口时,还需要根据业务规则处理缺少字段、非法金额、负数数量,以及小数位和舍入要求。
把 AI 建议变成可验证的改动
一次有效的排错过程,可以按这个顺序进行:
实际输入 → 最小复现 → 原因分析 → 最小修改 → 结果验证。
AI 给出修改后,先用原始输入确认问题已经解决,再检查其他输入会不会受到影响。如果修改方案一下子增加了多个函数或更换依赖,可以继续追问:“请只保留解决当前问题所必需的改动。”
排错时,把输入、类型和预期结果说明白,往往比反复要求 AI“再检查一遍”更有帮助。