Go货币处理库currency完整指南:告别float64浮点误差,仅40KB数据搞定全球货币 Go货币处理库currency完整指南告别float64浮点误差仅40KB数据搞定全球货币【免费下载链接】currencyCurrency handling for Go.项目地址: https://gitcode.com/gh_mirrors/cu/currencycurrency是一个专为 Go 语言打造的货币处理库内置Amount金额结构体、全球货币信息与国际化格式化器Formatter底层采用真实任意精度小数运算仅约40KB的内置数据即可覆盖全球所有货币。如果你被0.1 0.2 0.30000000000000004这类 float64 浮点误差折磨过这篇 Go 货币处理完整指南将帮你快速入门并掌握它的六大核心能力 为什么 Go 货币处理不该再用 float64金融计算中最经典的事故就是浮点误差fmt.Println(0.1 0.2) // 0.30000000000000004 用 float64 存金额看似简单实际会遇到两大痛点方案问题直接用 float64二进制浮点数无法精确表示十进制小数加减乘除都会累积误差存整数最小单位分多币种并存时难以排序比较且无法表达亚分精度税费、商户结算常需 3~4 位小数currency 库的解法底层使用任意精度十进制基于cockroachdb/apd包对外提供易用且安全的Amount抽象从 amount.go 可以看到金额由十进制数 货币代码组成天然杜绝浮点误差。六大核心功能一览 ✨功能说明对应文件金额结构体值语义Fowler 的 Money 模式加减乘除、取整、汇率换算amount.go全球货币数据ISO 货币代码、三位数字代码、小数位数CLDR v48data.go国际化格式化自动货币符号、分组、本地数字如阿拉伯数字 ٠١٢formatter.goLocale 支持语言/文字/地区三级结构支持父级语言回退locale.go国家映射国家代码一键查货币代码US→USDcurrency.go自定义货币注册 BTC 等非 ISO 货币或覆盖已有货币的数据currency.go快速上手3 步安装、创建金额、格式化输出 第 1 步安装go get github.com/bojanz/currency第 2 步创建金额并计算package main import ( fmt github.com/bojanz/currency ) func main() { // 从字符串创建金额推荐精度无损 amount, _ : currency.NewAmount(275.98, EUR) total, _ : amount.Mul(4) // 275.98 × 4 // 第 3 步用法语 Locale 格式化输出 formatter : currency.NewFormatter(currency.NewLocale(fr)) fmt.Println(formatter.Format(total)) // 1 103,92 € }第 3 步查看项目更多可运行示例参考 example_test.go其中每个函数都标注了预期输出可直接对照验证。核心功能一用 Amount 做安全的金额计算Amount的所有算术方法都是值语义的——原金额不被修改运算返回新金额且自动校验币种一致性// 加法币种不同会返回 MismatchError而不是算出错误结果 a, _ : currency.NewAmount(20.99, USD) b, _ : currency.NewAmount(3.50, USD) total, _ : a.Add(b) fmt.Println(total) // 24.49 USD // 汇率换算20.99 美元 → 欧元汇率 0.91 usd, _ : currency.NewAmount(20.99, USD) eur, _ : usd.Convert(EUR, 0.91) fmt.Println(eur.Round()) // 19.10 EUR几个实用细节定义见 amount.go零值友好任意Amount都能与零值相加/相减天然适合循环累加求和多种构造方式NewAmount字符串、NewAmountFromInt64最小单位整数、NewAmountFromBigInt大整数多种输出方式Number()取数值、BigInt()/Int64()转最小单位、String()取24.49 USD形式5 种取整模式怎么选不同场景结账、结算、报表需要不同取整策略amount.go 定义了 5 种模式模式规则适用场景RoundHalfUp≥5 进位默认日常展示RoundHalfEven银行家舍入5 时取偶金融结算误差分布更均匀RoundHalfDown5 才进位特殊计费规则RoundUp远离 0 方向进位收费场景对己不利RoundDown向 0 截断折扣场景amount, _ : currency.NewAmount(12.345, USD) fmt.Println(amount.RoundTo(2, currency.RoundHalfUp)) // 12.35 USD fmt.Println(amount.RoundTo(2, currency.RoundHalfEven)) // 12.34 USD核心功能二国际化格式化与反向解析Formatter这是 currency 库的杀手锏基于 CLDR v48 数据同一笔金额在不同语言地区自动呈现正确格式核心实现见 formatter.go// 土耳其语分组用点、小数用逗号 tr : currency.NewFormatter(currency.NewLocale(tr)) amount, _ : currency.NewAmount(1245.988, EUR) fmt.Println(tr.Format(amount)) // €1.245,988 tr.MaxDigits 2 fmt.Println(tr.Format(amount)) // €1.245,99 // 波斯语连数字都是本地化的 ٠-٩ fa : currency.NewFormatter(currency.NewLocale(fa)) irr, _ : currency.NewAmount(50270, IRR) fmt.Println(fa.Format(irr)) // ریال ۵۰٬۲۷۰Formatter还支持一组灵活的显示选项定义见 formatter.goMaxDigits/MinDigits控制小数位数与尾零NoGrouping关闭千位分组AccountingStyle会计风格负数显示为($3.00)CurrencyDisplay符号 / 代码 / 隐藏三种模式反向解析同样强大——用户在前端输入的本地格式金额可以直接解析回Amountamount, _ : tr.Parse(€1.234,59, EUR) // 1234.59 EUR amount, _ tr.Parse(1.234,59, EUR) // 无符号也能识别核心功能三全球货币数据与国家映射 内置数据约40KB包含 170 种货币的完整信息数据源见 data.go常用查询 API 在 currency.go 中// 国家代码 → 货币代码 code, ok : currency.ForCountryCode(US) // USD, true code, ok currency.ForCountryCode(FR) // EUR, true // 查询小数位数JPY 是 0 位KWD 是 3 位 digits, _ : currency.GetDigits(JPY) // 0 digits, _ currency.GetDigits(KWD) // 3 // 查询三位数字代码银行报文常用 numeric, _ : currency.GetNumericCode(USD) // 840 // 按地区取货币符号 symbol, _ : currency.GetSymbol(EUR, currency.NewLocale(fr)) // €为什么数据只有 40KB答案在智能筛选项目只取 CLDR 的 modern 子集约 560 个地区精简到 370 个剔除本库用不到的数据再按父级语言去重货币符号也做了分组合并。生成逻辑完整记录在 gen.go 中可通过go generate一键重新生成 data.go。进阶玩法 ️注册自定义货币如 BTC支持注册非 ISO 货币或覆盖已有货币的定义currency.Register(BTC, currency.Definition{ NumericCode: 1000, Digits: 8, // 比特币需要 8 位小数 DefaultSymbol: ₿, }) // 之后 NewAmount(0.5, BTC) 即可正常使用数据库存储与 JSON 序列化 ️Amount实现了 JSON 与数据库驱动接口amount.go几乎零成本接入现有系统JSON自动序列化为{number:24.49,currency:USD}PostgreSQL 复合类型通过driver.Valuer/sql.Scanner接口可直接存入(NUMERIC, TEXT)复合类型配合 pgx 驱动一行Scan完成读写示例见 README.md项目文件结构速览 文件作用amount.goAmount结构体、算术运算、取整模式、序列化接口currency.go货币注册表、国家映射、数字代码/小数位/符号查询formatter.go国际化格式化器与解析器locale.goLocale 解析与父级语言回退链data.goCLDR v48 生成的货币数据约 40KBgen.go从 CLDR 源数据重新生成 data.go 的脚本example_test.go全部 API 的可运行示例amount_test.go金额运算与取整的测试用例常见问题 FAQ ❓Q1金额能直接比较大小吗可以。Equal()判断相等、Cmp()返回 -1/0/1且内置的Equal()让它兼容google/go-cmp做结构体对比。Q2跨币种相加会怎样不会静默算错——Add/Sub/Cmp遇到币种不一致会返回MismatchError先Convert换算币种再运算即可。Q3如何升级货币数据货币数据由 CLDR 驱动修改 gen.go 后执行go generate即可重新生成 data.go业务代码无需任何改动。总结currency 库用极简的设计解决了 Go 生态中长期缺失的货币处理难题底层任意精度十进制保证算得准Amount 值语义保证用得安全CLDR 40KB 数据保证全球任何地区都展示得地道。无论是电商订单、财务对账还是国际化应用引入它只需一行go get就能让金额计算从此告别浮点误差 【免费下载链接】currencyCurrency handling for Go.项目地址: https://gitcode.com/gh_mirrors/cu/currency创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

cumulus collator-selection Pallet 解析:Parachain 如何实现开放出块与提名集(完整指南)

cumulus collator-selection Pallet 解析:Parachain 如何实现开放出块与提名集(完整指南)

cumulus collator-selection Pallet 解析:Parachain 如何实现开放出块与提名集(完整指南) 【免费下载链接】cumulus Write Parachains on Substrate 项目地址: https://gitcode.com/gh_mirrors/cum/cumulus cumulus 是 Polkadot 生态中…

2026/8/26 20:26:50
过了查重却过不了AIGC检测?2026论文AI工具横评+分阶段组合,帮你省钱不踩坑

过了查重却过不了AIGC检测?2026论文AI工具横评+分阶段组合,帮你省钱不踩坑

又到毕业季,身边学弟学妹的焦虑已经从"论文写不完"变成了"过了查重过不了AIGC检测"。现在高校普遍实行"双检"——既要查重复率,又要查AI生成率,不少同学用AI辅助写作后,对着满屏标红的AIGC报告欲哭…

2026/8/26 20:26:50
【Linux】线程到底是什么?从轻量级进程、虚拟地址到页表与 MMU,一次理清线程底层模型

【Linux】线程到底是什么?从轻量级进程、虚拟地址到页表与 MMU,一次理清线程底层模型

🔥个人主页:爱和冰阔乐 📚专栏传送门:《数据结构与算法》 、C 🐶学习方向:C方向学习爱好者 ⭐人生格言:得知坦然 ,失之淡然 🏠博主简介 文章目录前言一、线程到底是什么…

2026/8/26 20:26:50
天猫上架软件:活动名额毫秒级抢占,提交速度比人工快200倍

天猫上架软件:活动名额毫秒级抢占,提交速度比人工快200倍

天猫上架软件:活动名额毫秒级抢占,提交速度比人工快200倍 跑店群的兄弟都清楚,天猫的自动化上架,是店群运营中最耗人力也最容易出错的环节。 手动上架一个商品从填写标题、上传主图、设置SKU、填写详情到发布,熟练操…

2026/8/26 20:26:50
天猫上架软件:独占IP与指纹隔离,告别批量封号

天猫上架软件:独占IP与指纹隔离,告别批量封号

天猫上架软件:独占IP与指纹隔离,告别批量封号 做店群的老板都知道,天猫的自动化上架,是店群运营中最耗人力也最容易出错的环节。 手动上架一个商品从填写标题、上传主图、设置SKU、填写详情到发布,熟练操作也要3-5分…

2026/8/26 20:26:50
FastAPI + SQLAlchemy2.0 异步数据库

FastAPI + SQLAlchemy2.0 异步数据库

FastAPI 集成 SQLAlchemy2.0 异步数据库 主流 Python ORM 对比 Python 生态有很多 ORM 库:SQLAlchemy、Peewee、Pony ORM、Tortoise‑ORM。 SQLAlchemy:生态最成熟,支持异步,社区活跃 SQLModel:FastAPI 作者开发&…

2026/8/26 20:21:50