小编iga*_*nev的帖子

为什么 4.99 保存为 4.98?

我可能在矩阵中发现了一个故障。一位客户报告了一个错误:他们通过后端设置了产品价格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.994.98

我们为 stripe API 准备值的方式是:

let unit_amount = (product_price_row.price * 100f32) as i64;
Run Code Online (Sandbox Code Playgroud)

product_price_rowSeaORM 行所在的price位置是4.99

在这种情况unit_amount下最终为498.

似乎没有其他值会出现这样的故障。

我意识到这是一些奇怪的浮点错误簇,但它引起了我的注意。我写了一个小的 Rust 沙箱来说明发生了什么。要亲自测试它,请检查此 存储库

基本上可以归结为以下几点:

let i = 4.99; // any other .99 number …
Run Code Online (Sandbox Code Playgroud)

rust

-3
推荐指数
1
解决办法
102
查看次数

标签 统计

rust ×1