Rust將結構導出到json如何處理小數點問題


簡述

標準的 serde_json 序列化器不支持直接對浮點數進行格式化限制。如果將浮點數轉換成字符串,又太low逼。這里重點推薦rust_decimal。

#[derive(Serialize)]
pub struct StockTickRow {datetime: NaiveDateTime,code: String,name: String,#[serde(serialize_with = "serialize_float")]weight: f32,#[serde(serialize_with = "serialize_float")]wnbz: f32,#[serde(serialize_with = "serialize_float")]chgp: f32,
}fn serialize_float<S>(value: &f32, serializer: S) -> Result<S::Ok, S::Error>
whereS: Serializer,
{// 這種方式不行,只能轉換成字符串了// let rounded_value = (value * 100.0).round() / 100.0;// serializer.serialize_f32(rounded_value)let formatted_value = format!("{:.2}", value); // 固定兩位小數serializer.serialize_str(&formatted_value)
} 

上面是一開始我采用的方式,用了一天,心中不甘。就發現了rust_decimal。這個魔術師:

#[derive(Serialize, Deserialize)]pub struct StockTickRow {datetime: NaiveDateTime,code: String,name: String,#[serde(serialize_with = "serialize_decimal_two_digits")]weight: Decimal,#[serde(serialize_with = "serialize_decimal_two_digits")]wnbz: Decimal,
}fn serialize_decimal_two_digits<S>(value: &Decimal, serializer: S) -> Result<S::Ok, S::Error>
whereS: serde::Serializer,
{let rounded = value.round_dp(2);let float_value: f64 = rounded.try_into().unwrap_or(0.0); // 嘗試轉換,失敗時返回默認值serializer.serialize_f64(float_value)
}

它能在結果中輸出我們期望的格式:?

		{"datetime": "2025-04-30T15:09:01","code": "603019","name": "中科曙光","weight": 1.3,"wnbz": 1.22,"chgp": 1.72,}

如果你需要對Decimal類型進行某種轉換或實現,這是個好的例子,它用在dolphindb數據庫中:


impl FromDolphinScalar for Decimal {fn from_scalar(scalar: &ScalarImpl) -> Option<Self> {match scalar {ScalarImpl::Float(c) => c.into_inner().map(|v| Decimal::from_f32(v).unwrap()),ScalarImpl::Double(c) => c.into_inner().map(|v| Decimal::from_f64(v).unwrap()),_ => None,}}
}

Rust-Decimal 除了輸出json比較方便,它還是高精度金融計算庫,不會在四舍五入時丟失精度 。更多信息自己查吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openEuler 22.03 安裝 Redis 6.2.9,支持離線安裝

目錄 一、環境檢查1.1 必要環境檢查1.2 在線安裝&#xff08;有網絡&#xff09;1.3 離線安裝&#xff08;無網絡&#xff09; 二、下載Redis2.1 在線下載2.2 離線下載 三、安裝Redis四、配置Redis服務五、開機自啟服務六、開放防火墻端口七、常用命令 一、環境檢查 1.1 必要環…

MySQL基本查詢(二)

文章目錄 UpdateDelete插入查詢結果&#xff08;select insert&#xff09;聚合函數分組聚合統計 Update 1. 語法&#xff1a; set后面加列屬性或者表達式 UPDATE table_name SET column expr [, column expr …][WHERE …] [ORDER BY …] [LIMIT …] 案例 將孫悟空同學的…

Android Framework學習二:Activity創建及View繪制流程

文章目錄 Window繪制流程Window Manager Service&#xff08;WMS&#xff09;SurfaceSurfaceFlinger 安卓View層次結構ActivityPhoneWindowActivity與PhoneWindow兩者之間的關系ViewRootImplDecorViewDecorView 的作用DecorView 的結構總結 Activity創建流程View invalidate調用…

基于ssm的智慧養老平臺(全套)

一、系統架構 前端&#xff1a;jsp | js | jquery | css 后端&#xff1a;spring | springmvc | mybatis 環境&#xff1a;jdk1.8 | mysql | maven | tomcat 二、代碼及數據庫 三、功能介紹 01. 登錄 02. 管理員-主頁 03. 管理員-個人中心 04. 管理員-…

計算機視覺技術的發展歷程

計算機視覺技術的發展歷程可以分為以下幾個階段&#xff1a; 早期探索階段&#xff08;1960s-1980s&#xff09; 1960年代&#xff1a;計算機視覺的概念開始形成&#xff0c;研究者嘗試讓計算機識別和理解圖像&#xff0c;主要集中在基礎的圖像處理&#xff0c;如邊緣檢測和特…

2025五一杯B題五一杯數學建模思路代碼文章教學: 礦山數據處理問題

完整內容請看文章最下面的推廣群 問題1. 根據附件1中的數據和&#xff0c;建立數學模型&#xff0c;對數據A進行某種變換&#xff0c;使得變換后的結果與數據盡可能接近。計算變換后的結果與數據的誤差&#xff0c;并分析誤差的來源&#xff08;如數據噪聲、模型偏差等&#xf…

.NET 平臺詳解

什么是 .NET&#xff1f; .NET 是一個由微軟開發的跨平臺、開源的開發者平臺&#xff0c;用于構建多種類型的應用程序。它提供了一致的編程模型和豐富的類庫&#xff0c;支持多種編程語言&#xff08;如 C#、F#、Visual Basic&#xff09;。 .NET 的核心組成 運行時環境 CLR …

ICRA 2025 基于觸覺反饋的閉環分層控制框架——開放環境下通用門開啟的智能規劃與操作

在機器人領域&#xff0c;讓機器人在開放環境中與日常物品交互一直是個難題&#xff0c;其中開門任務極具挑戰性。門的設計、機械結構和推拉方式多種多樣&#xff0c;現有方法存在諸多局限。基于運動學的方法依賴已知門模型&#xff0c;面對未知門時難以發揮作用&#xff1b;幾…

阿里云服務遷移實戰: 07-其他服務遷移

概述 當完成了服務器、數據庫、IP、OSS等遷移后&#xff0c;剩下的就是其他服務了。 短信網關 短信模板只能一個個創建&#xff0c;不能批量操作。但是可以使用以下方式優化操作。 在原賬號導出模板列表 概述 當完成了服務器、數據庫、IP、OSS等遷移后&#xff0c;剩下的…

(六——下)RestAPI 毛子(Http resilience/Refit/游標分頁/異步大文件上傳)

文章目錄 項目地址一、Refit1.1 安裝需要的包1.2 創建接口IGitHubApi1.3 創建RefitGitHubService1. 實現接口2. 注冊服務 1.4 修改使用方法 二、Http resilience2.1 安裝所需要的包2.2 創建resilience pipeline簡單版2.3 創建全局的resilience處理1. 創建清理全局ResilienceHan…

leetcode 977. Squares of a Sorted Array

題目描述 雙指針法一 用right表示原數組中負數和非負數的分界線。 nums[0,right-1]的是負數&#xff0c;nums[right,nums.size()-1]是非負數。 然后用合并兩個有序數組的方法。合并即可。 class Solution { public:vector<int> sortedSquares(vector<int>&…

在 API 模擬階段:Apipost vs. Faker.js vs. Postman —— 為什么 Apipost 是最優選擇

在構建 API 的過程中&#xff0c;模擬數據的能力至關重要。就像你在做飯時等待食材送達一樣——沒有原料&#xff0c;菜也沒法完成。 但是&#xff0c;當你的后端還在開發中&#xff0c;而前端又急需真實的 API 響應進行開發時&#xff0c;該怎么辦&#xff1f;這時候&#xf…

一種快速計算OTA PSRR的方法(Ⅰ)

序言:最近碰到了一道有趣的習題&#xff0c;讓我重新思考了下如何計算運放的PSRR&#xff0c;再結合相關論文&#xff0c;現將所思所想分享出來&#xff0c;歡迎大家討論。 1.從Razavi的一道習題引入 題目要求計算電路的PSRR&#xff0c;已知PSRR定義為信號增益除以電源增益&am…

第十二屆藍橋杯 2021 C/C++組 空間

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 空間 - 藍橋云課 思路&#xff1a; 思路詳解&#…

TensorFlow深度學習實戰——基于循環神經網絡的情感分析模型

TensorFlow深度學習實戰——基于循環神經網絡的情感分析模型 0. 前言1. 數據處理2. 模型構建與訓練3. 模型評估相關鏈接 0. 前言 情感分析 (Sentiment Analysis) 是自然語言處理中的一項技術&#xff0c;旨在識別和提取文本中的情感信息&#xff0c;通常是分析一段文本中是否存…

eslint相關報錯收集

[vue/no-multiple-template-root]The template root requires exactly one element.eslint-plugin-vuejsx報錯&#xff1a;jsx報錯Parsing error: Unexpected token &#xff1c;eslint&#xff1b;ts報錯&#xff1a;Parsing error: Unexpected token {eslintmodule報錯 ‘mod…

【論文推薦】深度學習賦能地質災害分析:數據、模型、應用與機遇(用于地質災害分析的深度學習:數據源)

【論文推薦】深度學習賦能地質災害分析&#xff1a;數據、模型、應用與機遇&#xff08;用于地質災害分析的深度學習&#xff1a;數據源&#xff09; 【論文推薦】深度學習賦能地質災害分析&#xff1a;數據、模型、應用與機遇&#xff08;用于地質災害分析的深度學習&#xf…

判斷用戶選擇的Excel單元格區域是否跨頁?

VBA應用程序開發過程中&#xff0c;經常需要處理用戶選中的單元格區域&#xff0c;有的應用場景中&#xff0c;需要限制用戶選中區域位于同一頁中&#xff08;以打印預覽顯示的分頁劃分&#xff09;&#xff0c;但是VBA對象模型中并沒有提供相應的接口&#xff0c;用于快速查詢…

題解:洛谷 CF2091E Interesting Ratio

思路推導 我們先對 32 32 32 和 96 96 96 進行二進制拆分。 相同部分&#xff08;用 α \alpha α 表示&#xff09;&#xff1a; 5 5 5 個 2 2 2。 不同部分&#xff08;用 β \beta β 表示&#xff09;&#xff1a; 1 1 1 和 3 3 3。 gcd ? ( 32 , 96 ) \gcd(32,9…

linux安裝配置PostgreSQL

環境&#xff1a;centos7、SpringBoot、PostgreSQL15 PostgreSQL: Linux downloads (Red Hat family) PostgreSQL安裝 1.安裝 PostgreSQL Yum 倉庫 RPM 包 sudo rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noar…