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),仅供参考

相关新闻

Go运行时动态代码加载引擎goloader:它比官方plugin包强在哪的5大理由

Go运行时动态代码加载引擎goloader:它比官方plugin包强在哪的5大理由

Go运行时动态代码加载引擎goloader:它比官方plugin包强在哪的5大理由 【免费下载链接】goloader load and run golang code at runtime. (WARNING: this repo has not been maintained for a long time, please take a look at https://github.com/pkujhd/goloader)…

2026/8/26 19:36:29 阅读更多 →
SpringCloud-限流

SpringCloud-限流

企业级 Spring Cloud 项目里,限流一般不会只靠某一个组件,而是根据流量入口、服务类型和限流目标,做分层限流。 一、最常见:在 Gateway 网关层限流 企业项目通常会把第一层限流放在 Gateway。 ┌── user-service 客户端↓ …

2026/8/26 19:35:28 阅读更多 →
#CSP202503C. 模板展开

#CSP202503C. 模板展开

模板展开 - 题目详情 - 曙梦 OJ 题目一共就三种操作 操作一是直接赋值 这个很好理解 操作二是间接赋值 此时相当于保存了一个字符串拼接公式 里面的字符串可能会随着后续赋值而改变 操作三是输出长度 这题根据子任务 很容易拿到40%的分数 若想将分数拿满,就需…

2026/8/26 19:35:28 阅读更多 →

最新新闻

AI 会取代程序员吗?

AI 会取代程序员吗?

因 AI 编程工具被推出, 人们开启思考, “AI 会不会取代程序员? ”, AI 行业持续推出新的升级以及更新, 所以好多人担忧, 能完全取代人类程序员的 AI 工具或许很快会成为主流。然而, 实际状况断然绝非这般。此篇文章会对AI替代程序员的可能性予以评估, 而且会介绍怎样依靠掌握关…

2026/8/26 20:31:55 阅读更多 →
界面组件DevExpress WPF TreeView中文指南 - 如何实现数据分层展示

界面组件DevExpress WPF TreeView中文指南 - 如何实现数据分层展示

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress新旧版本帮…

2026/8/26 20:31:54 阅读更多 →
AI基座哪家方案好

AI基座哪家方案好

这两年,“AI基座”成了教育信息化领域的高频词。不少学校在数字化转型中遇到难题:系统买了不少,数据却不通;功能看着都有,用起来却不是那么回事;更别提想用AI赋能教学管理,发现底子完全撑不住。…

2026/8/26 20:31:54 阅读更多 →
Python从键盘获取输入

Python从键盘获取输入

之前做测试笔试的时候有很长一段时间不清楚怎么从键盘获取多个值的输入,终于一时兴起将各种情况下获取输入数值的方法进行了归纳,希望对刚好看到的您有帮助。 一、输入为一个值: 需要注意:input()返回的是字符串类型&#xff0c…

2026/8/26 20:31:54 阅读更多 →
非正态性(双峰)数据正态化处理(sklearn)

非正态性(双峰)数据正态化处理(sklearn)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/8/26 20:31:54 阅读更多 →
Android Binder通信原理(一):简介

Android Binder通信原理(一):简介

源码基于:Android R 0. 前言 在Linux 系统中现有的进程间通信(IPC)方式: 管道(PIPE):在创建时分配一个page大小的内存,缓存区大小比较有限;命名管道(FIFO):考虑 PIPE_BUF 和原子操…

2026/8/26 20:30:54 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →