Rust将布局导出到json如那里理小数点题目

[复制链接]
发表于 2025-9-18 00:17:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
简述
尺度的 serde_json 序列化器不支持直接对浮点数进行格式化限定。假如将浮点数转换成字符串,又太low逼。这里重点保举rust_decimal。
  1. #[derive(Serialize)]
  2. pub struct StockTickRow {
  3.     datetime: NaiveDateTime,
  4.     code: String,
  5.     name: String,
  6.     #[serde(serialize_with = "serialize_float")]
  7.     weight: f32,
  8.     #[serde(serialize_with = "serialize_float")]
  9.     wnbz: f32,
  10.     #[serde(serialize_with = "serialize_float")]
  11.     chgp: f32,
  12. }
  13. fn serialize_float<S>(value: &f32, serializer: S) -> Result<S::Ok, S::Error>
  14. where
  15.     S: Serializer,
  16. {
  17.     // 这种方式不行,只能转换成字符串了
  18.     // let rounded_value = (value * 100.0).round() / 100.0;
  19.     // serializer.serialize_f32(rounded_value)
  20.     let formatted_value = format!("{:.2}", value); // 固定两位小数
  21.     serializer.serialize_str(&formatted_value)
  22. }
复制代码
上面是一开始我接纳的方式,用了一天,心中不甘。就发现了rust_decimal。这个把戏师:
  1. #[derive(Serialize, Deserialize)]
  2. pub struct StockTickRow {
  3. datetime: NaiveDateTime,
  4. code: String,
  5. name: String,
  6. #[serde(serialize_with = "serialize_decimal_two_digits")]
  7. weight: Decimal,
  8. #[serde(serialize_with = "serialize_decimal_two_digits")]
  9. wnbz: Decimal,
  10. }
  11. fn serialize_decimal_two_digits<S>(value: &Decimal, serializer: S) -> Result<S::Ok, S::Error>
  12. where
  13.     S: serde::Serializer,
  14. {
  15.     let rounded = value.round_dp(2);
  16.     let float_value: f64 = rounded.try_into().unwrap_or(0.0); // 尝试转换,失败时返回默认值
  17.     serializer.serialize_f64(float_value)
  18. }
复制代码
它能在效果中输出我们渴望的格式: 
  1.                 {
  2.                         "datetime": "2025-04-30T15:09:01",
  3.                         "code": "603019",
  4.                         "name": "中科曙光",
  5.                         "weight": 1.3,
  6.                         "wnbz": 1.22,
  7.                         "chgp": 1.72,
  8.         }
复制代码
假如你必要对Decimal范例进行某种转换或实现,这是个好的例子,它用在dolphindb数据库中:
  1. impl FromDolphinScalar for Decimal {
  2.     fn from_scalar(scalar: &ScalarImpl) -> Option<Self> {
  3.         match scalar {
  4.             ScalarImpl::Float(c) => c.into_inner().map(|v| Decimal::from_f32(v).unwrap()),
  5.             ScalarImpl::Double(c) => c.into_inner().map(|v| Decimal::from_f64(v).unwrap()),
  6.             _ => None,
  7.         }
  8.     }
  9. }
复制代码
Rust-Decimal 除了输出json比力方便,它还是高精度金融盘算库,不会在四舍五入时丢失精度 。更多信息本身查吧。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表