OpenHarmony鸿蒙PC完成ohos-sdk适配自动签名编译rust_decimal三方库,用于高精度十进制浮点场景
欢迎加入开源鸿蒙PC社区 https://harmonypc.csdn.net/欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloperAtomGit 仓库地址https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo本文讲解鸿蒙 PC 端 Rust 开发环境搭建鸿蒙基于 musl 库、强制二进制签名无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew提供两套编译方案方案一安装 llvm-gcc-compat零配置开箱即用方案二仅安装 ohos-sdk需手动配置 Cargo 链接器二者都依托 ohos-sdk 完成自动签名编译。完整的过程可以参考一下【OpenHarmony 鸿蒙 PC CodeArts IDE 实现 Rust开发完整开发环境搭建指南】一、rust_decimal 库介绍作用rust_decimal是 Rust 高精度十进制浮点库专门解决f32/f64二进制浮点数精度丢失问题金钱、财务、计费、汇率、库存金额场景绝对不能用 f64。核心能力高精度十进制运算最多支持 28 位有效数字金融标准精度支持加减乘除、四舍五入、向上/向下取整、保留指定位小数自带货币格式化、字符串互转、整数互相转换提供四则运算、比较、取模、幂运算支持 serde 序列化可直接存 JSON、数据库金额字段。适用场景支付金额、订单总价、商品单价、税费计算、汇率换算、财务报表、记账系统、积分金额。二进制浮点数坑对比// f64 致命缺陷0.1 0.2 ! 0.3println!({},0.10.2);// 输出 0.30000000000000004// rust_decimal 无精度丢失0.1 0.2 严格等于 0.3二、安装cargoaddrust_decimal--featuresstdcargoaddrust_decimal_macrosCargo.toml[package] name decimal_demo version 0.1.0 edition 2021 [dependencies] rust_decimal { version 1.36, features [std] } rust_decimal_macros 1.36rust_decimal_macros提供dec!宏快速字面量定义十进制数字三、完整零报错示例代码 main.rsuserust_decimal::prelude::*;userust_decimal_macros::dec;fnmain(){println!( 1. 基础创建 Decimal 对象宏/字符串/整数 );demo_create_decimal();println!(\n 2. 四则运算无精度丢失 );demo_calc();println!(\n 3. 小数舍入、保留2位小数金额场景 );demo_round();println!(\n 4. 简单金额格式化输出人民币 );demo_format_money();println!(\n 5. 比较大小、取绝对值、取反 );demo_compare_math();println!(\n 6. 字符串、数字互相转换 );demo_convert();}/// 1. 三种创建Decimal方式fndemo_create_decimal(){// 宏直接写小数最常用letpricedec!(99.99);// 从整数构造letnumDecimal::from(1000);// 从安全字符串构造前端传金额字符串推荐letfrom_strDecimal::from_str(0.12345).unwrap();println!(商品单价: {},price);println!(整数转换: {},num);println!(字符串构造: {},from_str);// 经典浮点坑对比letadec!(0.1);letbdec!(0.2);println!(0.1 0.2 {},ab);// 精确等于0.3无误差}/// 2. 加减乘除四则运算fndemo_calc(){letunit_pricedec!(29.99);letcountdec!(3);lettax_ratedec!(0.09);letsubtotalunit_price*count;// 小计lettaxsubtotal*tax_rate;// 税费lettotalsubtotaltax;// 总价println!(单价{} × 数量{} 小计{},unit_price,count,subtotal);println!(9%税费: {},tax);println!(订单总金额: {},total);// 除法lettotal_moneydec!(99.9);letpeopledec!(3);letavgtotal_money/people;println!(三人平分99.9人均: {},avg);}/// 3. 金额四舍五入、保留2位小数修复RoundingStrategy不存在Ceiling/Floorfndemo_round(){letrawdec!(123.4567);// 默认四舍五入保留2位小数金融通用letround_2raw.round_dp(2);// 向上取整替代Ceilingletceil_2raw.ceil();// 向下取整替代Floorletfloor_2raw.floor();println!(原始值: {},raw);println!(四舍五入保留2位: {},round_2);println!(整体向上取整: {},ceil_2);println!(整体向下取整: {},floor_2);}/// 4. 简单货币格式化移除FormatOptions不存在APIfndemo_format_money(){letmoneydec!(1288.56);println!(格式化金额: ¥{},money.round_dp(2));letsmalldec!(0.05);println!(小额金额: ¥{},small.round_dp(2));}/// 5. 比较、绝对值、取反fndemo_compare_math(){letadec!(10.5);letbdec!(8.2);letnegdec!(-20.33);println!(10.5 8.2 ? {},ab);println!(相等判断: {},dec!(5.0)dec!(5));println!(负数绝对值: {},neg.abs());println!(数字取反: {},-a);}/// 6. 类型互相转换fndemo_convert(){letvaldec!(1234.56);// Decimal → 字符串letsval.to_string();println!(转字符串: {},s);// Decimal → i64截断小数letint_partval.trunc().to_i64().unwrap();println!(取整数部分i64: {},int_part);// 字符串转回Decimalletparse_backDecimal::from_str(s).unwrap();println!(字符串转回Decimal: {},parse_back);}一、库基础说明rust_decimal是 Rust 金融高精度十进制库专门解决 f32/f64 二进制浮点精度丢失问题0.1 0.2 ≠ 0.3订单金额、支付、税费、记账场景必须使用禁止用普通浮点数。配套rust_decimal_macros提供dec!宏快速创建十进制字面量。头部导入userust_decimal::prelude::*;userust_decimal_macros::dec;rust_decimal::prelude::*预导入所有高频类型、方法、TraitDecimal、运算、取整、转换方法不用逐个单独导入。dec!宏编译期生成高精度十进制数字写法简洁财务代码最常用。main 入口函数按业务常用场景分成6个模块依次执行创建Decimal数字的3种方式加减乘除四则金融运算小数保留、向上/向下取整人民币金额打印格式化大小比较、绝对值、负数取反Decimal 和字符串/整数互相转换模块1 demo_create_decimal 创建数字fndemo_create_decimal(){// 宏直接写小数最常用letpricedec!(99.99);// 从整数构造letnumDecimal::from(1000);// 从安全字符串构造前端传金额字符串推荐letfrom_strDecimal::from_str(0.12345).unwrap();println!(商品单价: {},price);println!(整数转换: {},num);println!(字符串构造: {},from_str);// 经典浮点坑对比letadec!(0.1);letbdec!(0.2);println!(0.1 0.2 {},ab);// 精确等于0.3无误差}三种创建方式说明dec!(99.99)宏编译期直接解析数字生成Decimal性能最高写固定金额首选。Decimal::from(1000)i32/i64 整数转金额适合库存数量、整数元数。Decimal::from_str(0.12345)前端接口、数据库取出的字符串金额专用。前端如果传数字0.1用JSON浮点传输会失真统一传字符串再解析是行业规范。浮点缺陷演示f64二进制存储小数存在误差0.10.2结果是0.30000000000000004Decimal 使用十进制存储计算完全精准金融不会出现分钱差错。模块2 demo_calc 四则运算订单计算场景fndemo_calc(){letunit_pricedec!(29.99);letcountdec!(3);lettax_ratedec!(0.09);letsubtotalunit_price*count;// 小计lettaxsubtotal*tax_rate;// 税费lettotalsubtotaltax;// 总价println!(单价{} × 数量{} 小计{},unit_price,count,subtotal);println!(9%税费: {},tax);println!(订单总金额: {},total);// 除法lettotal_moneydec!(99.9);letpeopledec!(3);letavgtotal_money/people;println!(三人平分99.9人均: {},avg);}业务逻辑模拟模拟电商订单计算单价 × 数量 商品小计小计 × 税率 税费相加得到实付总价。Decimal 重载 - * /运算符写法和普通数字完全一致全程无精度丢失。除法适合分摊金额、单价换算。模块3 demo_round 小数保留与取整金融核心fndemo_round(){letrawdec!(123.4567);// 默认四舍五入保留2位小数金融通用letround_2raw.round_dp(2);// 向上取整替代Ceilingletceil_2raw.ceil();// 向下取整替代Floorletfloor_2raw.floor();println!(原始值: {},raw);println!(四舍五入保留2位: {},round_2);println!(整体向上取整: {},ceil_2);println!(整体向下取整: {},floor_2);}方法解释.round_dp(n)保留n位小数默认四舍五入人民币金额统一保留2位元、分。.ceil()向上取整不管小数多少直接进1商家计费、运费计算常用。.floor()向下取整直接舍弃所有小数退款、优惠抵扣场景使用。模块4 demo_format_money 金额格式化打印fndemo_format_money(){letmoneydec!(1288.56);println!(格式化金额: ¥{},money.round_dp(2));letsmalldec!(0.05);println!(小额金额: ¥{},small.round_dp(2));}逻辑简单输出人民币符号¥同时统一保留两位小数保证页面展示格式统一不会出现1288.5或1288.567这种不合规金额。模块5 demo_compare_math 比较与基础数学运算fndemo_compare_math(){letadec!(10.5);letbdec!(8.2);letnegdec!(-20.33);println!(10.5 8.2 ? {},ab);println!(相等判断: {},dec!(5.0)dec!(5));println!(负数绝对值: {},neg.abs());println!(数字取反: {},-a);}支持 !全部比较运算符用于判断满减门槛、余额是否充足.abs()取绝对值计算差价、手续费差额-Decimal直接对数字取反计算退款、负数余额。模块6 demo_convert 类型互相转换fndemo_convert(){letvaldec!(1234.56);// Decimal → 字符串letsval.to_string();println!(转字符串: {},s);// Decimal → i64截断小数letint_partval.trunc().to_i64().unwrap();println!(取整数部分i64: {},int_part);// 字符串转回Decimalletparse_backDecimal::from_str(s).unwrap();println!(字符串转回Decimal: {},parse_back);}转换业务用途.to_string()接口JSON返回金额、存入文本日志.trunc().to_i64()舍弃小数只保留整数用于把金额转为“分”存储到数据库整数字段Decimal::from_str()后端接收前端字符串金额反向解析。全局开发规范总结所有金额、汇率、计费数值禁止 f64/f32统一 Decimal前后端传输金额优先字符串规避浮点JSON失真展示、入库前一律用.round_dp(2)保留两位小数计算退款、运费时按需使用ceil()/floor()明确取整规则避免财务纠纷。四、代码分段详细解释1. 导入userust_decimal::prelude::*;userust_decimal_macros::dec;prelude::*一次性导入全部常用类型、Trait、枚举Decimal、RoundingStrategy、FormatOptions等dec!宏编译期直接生成高精度十进制字面量财务代码首选2. 创建Decimal三种方式dec!(123.45)宏最简单编译期求值无运行时解析开销Decimal::from(i64/u64)整数转金额Decimal::from_str(0.123)接收前端/数据库字符串金额安全避免浮点误差3. 四则运算核心优势Decimal重载 - * /运算符运算全程十进制逻辑不会出现二进制浮点微小误差适合订单、税费、分润计算。4. 舍入策略金融必用.round_dp(n)默认四舍五入保留n位小数人民币保留2位RoundingStrategy::Ceiling向上进位商家计费常用RoundingStrategy::Floor向下舍弃退款、扣减场景5. 货币格式化FormatOptions配置千位分隔符、小数点分隔符输出1,288.56标准金额展示格式。6. 类型互转转字符串接口返回、数据库存储转整数提取元、分整数存储字符串反向解析接收前端传入金额字符串五、业务高频极简片段1. 计算订单总价并保留2位小数userust_decimal::prelude::*;userust_decimal_macros::dec;fncalc_total(price:Decimal,num:Decimal,tax:Decimal)-Decimal{lettotalprice*num*(dec!(1)tax);total.round_dp(2)}2. 安全解析前端金额字符串fnparse_money(s:str)-OptionDecimal{Decimal::from_str(s).ok()}3. 金额比较判断优惠门槛letorder_totaldec!(299.9);iforder_totaldec!(300){println!(满足满减条件);}六、重要使用规范所有金额禁止 f32/f64一律使用 Decimal前后端传金额优先用字符串传输避免JSON浮点失真存储数据库建议 decimal 字段或存整数“分”展示金额前统一.round_dp(2)保留两位小数涉及计费扣费明确指定舍入策略避免纠纷。

相关新闻

Day 2 | 3. 无重复字符的最长子串:尝试绕过窗口的一天

Day 2 | 3. 无重复字符的最长子串:尝试绕过窗口的一天

错误尝试一:用 char 变量维护区间边界我最开始想用类似快慢指针的思路,但把指针设成了 char 类型,用 left 和 right 记录当前子串的“字符边界”,并试图通过 right ! s[i] 来判断是否重复。public class Solution {public int Len…

2026/6/19 1:15:11阅读更多 →
多条产线PLC并发采集效率低,以太网转换器单模块支持6台上位机同步采集无缝对接组态王SCADA

多条产线PLC并发采集效率低,以太网转换器单模块支持6台上位机同步采集无缝对接组态王SCADA

一、项目背景本次应用落地于华东某电子元器件组装车间,车间内布局12条独立组装与检测产线,全线搭载松下FP-X、FP-X0系列传统串口型PLC,均为无原生以太网接口的老旧设备。长期以来,所有PLC均处于单机独立运行状态,仅支持…

2026/6/19 1:15:11阅读更多 →
“涪车出海”直达北非

“涪车出海”直达北非

近日,随着一声嘹亮的汽笛声划破长空,一列满载鑫源汽车散件的西部陆海新通道班列从涪陵龙头港缓缓驶出。这趟班列经广西钦州港转海运,最终将抵达北非阿尔及利亚。这是涪陵龙头港首次开行直达北非的汽车散件专列,标志着“涪车出海”…

2026/6/19 1:15:11阅读更多 →
能量最小化:从图割到深度学习,图像分割与数据聚类的核心优化框架

能量最小化:从图割到深度学习,图像分割与数据聚类的核心优化框架

1. 项目概述:能量最小化与数据分割的底层逻辑在计算机视觉和数据分析的日常工作中,我们常常面对一个看似简单却极其核心的任务:如何把一张图片里不同的物体分开,或者把一堆看似杂乱的数据点归成有意义的几类。无论是医学影像中分割…

2026/6/19 2:40:15阅读更多 →
黄金暴涨:虚拟时代的原始信仰

黄金暴涨:虚拟时代的原始信仰

黄金的悖论纽约商品交易所的电子钟跳过下午1点30分,黄金期货价格突破了每盎司2500美元。世界另一端,加纳的塔夸矿区,工人们正沿着蜿蜒的地下巷道下行,头顶的安全灯在岩壁上投出晃动的光斑。这两个场景之间,隔着8700公里…

2026/6/19 2:40:15阅读更多 →
IP-Adapter-FaceID终极指南:3步实现精准人脸身份生成与优化

IP-Adapter-FaceID终极指南:3步实现精准人脸身份生成与优化

IP-Adapter-FaceID终极指南:3步实现精准人脸身份生成与优化 【免费下载链接】IP-Adapter-FaceID 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/IP-Adapter-FaceID IP-Adapter-FaceID是一个强大的人脸身份适配器项目,能够基于特定人脸…

2026/6/19 2:40:15阅读更多 →
基于Django框架的门窗定制管理系统的设计与实现

基于Django框架的门窗定制管理系统的设计与实现

第1章 绪论1.1 课题背景现代建筑设计与装修风格多样化,门窗作为建筑的重要组成部分,其定制需求越来越大。传统门窗定制流程繁杂、客户体验差、管理效率低,已经不能满足目前市场的需求,因此开发出一套高效的门窗定制管理系统就显…

2026/6/19 2:40:15阅读更多 →
驱动调试:从内核崩溃到设备稳定的系统化排障方法论

驱动调试:从内核崩溃到设备稳定的系统化排障方法论

驱动调试:从内核崩溃到设备稳定的系统化排障方法论 一、当设备驱动导致Kernel Panic:驱动Bug的毁灭性后果 设备驱动运行在内核态,一个 Bug 就可能导致整个系统崩溃。一个典型的场景:一个自定义的 PCIe 设备驱动,在中断…

2026/6/19 2:40:15阅读更多 →
免费虚拟显示器终极指南:ParsecVDisplay完整解决方案

免费虚拟显示器终极指南:ParsecVDisplay完整解决方案

免费虚拟显示器终极指南:ParsecVDisplay完整解决方案 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否曾经因为显示器数量不足而影响工作效率?或者需…

2026/6/19 2:35:15阅读更多 →
Photobucket付费墙背后:5美元买童年回忆却落得一场空!

Photobucket付费墙背后:5美元买童年回忆却落得一场空!

1. 付费墙初现如今身处万亿市值公司林立的时代,我们也不能轻易放弃5美元。就像Photobucket,它曾相当于过去的Imgur,我们小时候常把图片上传到这个网站,然后在各种论坛上分享链接,它简单好用,尽职尽责。但最…

2026/6/19 0:04:37阅读更多 →
如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live…

2026/6/19 0:04:37阅读更多 →
yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南 【免费下载链接】yuzu 项目地址: https://gitcode.com/GitHub_Trending/yuz/yuzu yuzu作为目前最流行的开源Nintendo Switch模拟器,不仅提供了完整的游戏运行环境,还内…

2026/6/19 0:04:37阅读更多 →