我可能在矩阵中发现了一个故障。一位客户报告了一个错误:他们通过后端设置了产品价格4.99
,并说保存为4.98。
我怀疑他们输入了错误的值,所以我自己测试了它,确实该值出现了,而4.98
不是4.99
。所有其他产品价格似乎不受影响。一堆 0.99s、1.99s 和 19.99s。我认为我们最近可能引入了这个错误,因为这是客户第一次也是唯一一次报告看到这样的问题。
为了给您提供更多背景信息,它是一个 React UI,它使用 apollo graphql 将数据推送到 Rust (actix) 后端。然后,后端将需要保存的任何内容保存在数据库中,并且产品价格通过其 API 发送到 stripe。4.98 是条纹的。Stripe API 接受价格的方式是单位金额,即美分,而不是美元。所以4.99
应该以条纹着陆499
。根据我们后端发送的他们的仪表板498
。啥?!
几分钟后
我无法缩小代码中任何明显错误的范围。graphql 突变将其作为浮点值发送,它再次4.99
保存在我们的数据库中,但价格最终以条带形式出现。FLOAT(4,2)
4.99
4.98
我们为 stripe API 准备值的方式是:
let unit_amount = (product_price_row.price * 100f32) as i64;
Run Code Online (Sandbox Code Playgroud)
product_price_row
SeaORM 行所在的price
位置是4.99
。
在这种情况unit_amount
下最终为498
.
似乎没有其他值会出现这样的故障。
我意识到这是一些奇怪的浮点错误簇,但它引起了我的注意。我写了一个小的 Rust 沙箱来说明发生了什么。要亲自测试它,请检查此 存储库。
基本上可以归结为以下几点:
let i = 4.99; // any other .99 number …
Run Code Online (Sandbox Code Playgroud) rust ×1