在 Go 项目里,涉及到金额计算,大家一般用什么方式?

172 天前
 inSpring
  1. 以分为单位存储,然后程序里都使用整形来计算
  2. 以元到单位存储,使用 math/big 包处理高精度金额
6266 次点击
所在节点    Go 编程语言
48 条回复
layxy
172 天前
@adoal 字符串
realpg
172 天前
不是特殊金融行业 一律分
金融行业也争取用小数点后八位 int64
ALongRanger
172 天前
我的回答可能和具体语言无关。
1. 建议采用对应货币最小单位作为存储,主要是为了避免在计算和存储过程中产生精度损失导致资损;

2. 不管是 java 还是 go ,请编码统一的金额处理工具包,定义好金额结构和转换方法,避免直接使用基础结构例如整形,浮点来表示金额, 所有金额的表示直接使用定义好的金额结构。 整个项目内部统一采用,保证金额计算、转换的准确性。

3. 一个金额处理工具包应该考虑如下内容:
3.1. 要能够进行序列化和比较
3.2 要能存储币种和金额,要确保高精度和标准化
3.3 要能提供丰富的操作方法,包括加减乘除,需要自定义舍入和四舍五入;
3.4 要提供常用单位 getAmount()和获取最小单位金额的方法 getAmountMinorUnit()
3.5 确保结构的不可变性和安全性;
3.6 需要能够根据币种计算出最小单位,例如人民币就是分,日元就是元;
3.7 乘除支持舍入,默认使用四舍五入,但是支持其它舍入方式。

以上可以在跨境支付、金融应用等需要高精度、多币种支持的场景种安全有效的进行金额处理。
hwdq0012
172 天前
c#里用 decimal 类型,十进制浮点
pkoukk
172 天前
https://pkg.go.dev/github.com/shopspring/decimal
用这个,它同时支持 MYSQL
pkoukk
172 天前
@zhangfeiwudi 业务决定,不同场景不同处理方式,可能都会有。
james122333
172 天前
在前公司用 math/big 并封装成一 struct
本来想用 decimal 但搞计算的用 math/big 就算了
理由是精度够高了
至于延后计算可能要另外找库或自己刻 没特别研究过 肯定是种专业的数学库
ixcode
172 天前
bigint + decimal 加密货币小数点后 18 位都能算
sampeng
172 天前
so ?你要用毛吗?哈哈哈哈哈哈
mindddd
172 天前
@kk2syc 这个老哥可以
lesismal
172 天前
除了 blockchain 动辄多少个 0 的大范围数值,其他普通领域 int64 保平安足够了
mengzhuo
172 天前
某鹅某部门就是分为单位,int64
veni2023
172 天前
@w568w 这个库作者好像没空维护了
cheng6563
172 天前
反正别出现浮点数就行了
KingHL
172 天前
这个有什么鸡毛讨论的,普通货币有用 2 的大聪明出来说说?
james122333
172 天前
@james122333

讲细一点 我跟着用而已
realpg
172 天前
@zhangfeiwudi #15
正常来说财务账目上没有除法运算 设计上最后平衡都是加减(乘)
除法无论怎么算都是不影响平账的
如果除法能影响平账 那就是设计逻辑有问题 架构开除就好了
james122333
172 天前
细思了一下 其实这问题调用系统的 bc 命令也是个解法 还实现延后计算的问题 如果有 golang 版做成 lib 的 bc 会更好
moudy
172 天前
@sardina #10 记得巴菲特的公司曾经一天来回交易的流水把 8 位小数级别的误差给弄到小数点前面去了
james122333
172 天前
事实上 bc 是种语言 也有 function 可以用 任意精度到 2147483647 位
https://zh.m.wikipedia.org/zh-cn/Bc%E8%AF%AD%E

命令行 cp 值真的太高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1122800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX