在主流编程语言中,AI助手计算订单总额时,最常见的完成方式是返回一个二进制浮点数(double、float或number)。这几乎是公开互联网上表示金钱的默认做法,因此模型也会倾向于生成这样的代码。然而,在任何受监管的金融领域中,这种做法都是错误的。原因在于IEEE 754标准下的一个数学事实:二进制浮点数无法精确表示0.1,所以0.1 + 0.2 ≠ 0.3。单次运算误差极小,但在大规模交易中会不断累积,导致对账偏差、舍入争议和审计问题。 Delta定律第五条用五个词概括:“No float for money. No exceptions.”(金钱不用浮点数,没有例外。)其推论是:类型本身就是约束。正如电影《办公空间》中的“切香肠”舞弊案,本质上就是一个舍入故事——浮点数的存在让这种微小的截取显得合理。 要落实这条定律,需要两道防线。第一,明确告诉模型规则:任何涉及货币数值的提示词,必须在约束区写明——货币值必须使用精确十进制表示(如C#的decimal、Java的BigDecimal或整数最小单位、Python的decimal.Decimal、TypeScript/JS的整数分或十进制库);禁止使用二进制浮点数;仅在聚合边界按政策使用银行家舍入。这一条约束足以改变模型对“合理”的定义。Veracode 2026年报告指出,模型在安全任务中失败的原因与这里完全一致:训练语料编码了历史错误模式,只有你显式给出的约束才能压过语料的影响。 第二,利用类型系统兜底。建议定义领域专用的Money类型,其基于浮点数的构造函数被标记为不可用——例如在C#中,用`[Obsolete(error: true)]`修饰接收double的构造函数,这样无论AI还是人写的代码,只要尝试用浮点数构造Money,就会因编译错误而失败,并附带解释信息。提示词引导生成方向,类型系统捕获未被引导的遗漏。两者结合,才能确保“金钱不用浮点数”成为真正不可逾越的边界。
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.