You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:21:28