Rust使用serde反序列化f64字段时自动除以100的实现方法
你写的反序列化函数有个基础错误:my_val字段本身是f64类型,函数返回值不能写Result<u64, D::Error>,必须和字段类型匹配,改为返回Result<f64, D::Error>即可。
函数内部逻辑非常简单:先从反序列化器读取字段的原始数值,做完除法运算后返回结果就行,完整实现代码如下:
use serde::Deserialize; use serde::de::Deserializer; #[derive(Debug, Deserialize, Clone)] pub struct MyObject { pub other: String, #[serde(deserialize_with = "my_val_division")] pub my_val: f64, } fn my_val_division<'de, D>(deserializer: D) -> Result<f64, D::Error> where D: Deserializer<'de>, { // 先读取字段原始的数值 let raw_val = f64::deserialize(deserializer)?; // 除以100后返回 Ok(raw_val / 100.0) }
补充说明
- 这个实现兼容JSON、YAML、TOML等常见自描述格式中该字段为整数、浮点数的场景:比如源数据中
my_val值为整数5000,反序列化后得到50.0;值为浮点数123.4,反序列化后得到1.234,完全符合需求。 - 如果是金融类对精度要求高的场景,不建议用
f64存储数值,容易出现浮点数精度误差,可以替换为定点数类型,对应调整反序列化逻辑里的数值类型即可。
内容的提问来源于stack exchange,提问作者PascalVKooten
相关产品推荐
相关产品推荐

