我对Rust还比较陌生。我正在尝试进行一个需要序列化JSON正文的API调用。
JSON正文包含一个order_amount关键字,其值只能采用INR格式100.36,即卢比100和派塞36。还有一些其他例子,如10.48、3.20、1.09。
我遇到的问题是,经过serde_json中json!()的序列化后,浮点数值变成了类似于100.359765464332的形式。
随后API失败,因为它期望order_amount只有两个小数位。
这里是我的代码:
导入
use lambda_runtime::{handler_fn, Context, Error};
use reqwest::header::ACCEPT;
use reqwest::{Response, StatusCode};
use serde_json::json;
use std::env;
#[macro_use]
extern crate serde_derive;
我要序列化的结构体
#[derive(Serialize, Deserialize, Clone, Debug)]
struct OrderCreationEvent {
order_amount: f32,
customer_details: ...,
order_meta: ...,
}
例如:这里的order_amount具有15.38的值。
async fn so_my_function(
e: OrderCreationEvent,
_c: Context,
) -> std::result::Result<CustomOutput, Error> {
let resp: Response = client
.post(url)
.json::<serde_json::Value>(&json!(e))
.send()
.await?;
在 json!() 后,数量被序列化为 15.379345234542。我需要的是 15.38。
我阅读了一些关于编写自定义 f32 序列化器以截取 2 位小数的文章,但我在 Rust 中的技能有限。
因此,我找到了这段代码并一直在尝试调试,但仍然没有成功:
fn order_amount_serializer<S>(x: &f32, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
s.serialize_f32(*x)
// Ok(f32::trunc(x * 100.0) / 100.0)
}
无论自定义序列化器是否是解决问题的正确方法或方案,我仍然想学习如何编写它。所以请随意为我提供指导。 干杯!:)
.1 + .2 != .3
的问题。要么使用默认精度2,并将值存储为派斯(paise)数字u32,要么创建一个Money结构体,包含值和精度。https://martinfowler.com/eaaCatalog/money.html - Yury Tarabankos.serialize_f32(f32::trunc(*x * 100.0) / 100.0)
了吗? - user4815162342