Go | 表示货币的方法

Jul 12, 2025
#go

Notion链接

基准单位选择

货币表示的一个关键问题是选择什么作为基准单位。主流做法有两种:

  1. 使用最小单位(分、cent等):将货币以最小单位存储为整数
    • 例如:¥10.99存储为1099(分),$5.25存储为525(美分)
    • 优点:避免浮点数精度问题,计算准确
    • 缺点:需要在展示时进行转换
  2. 使用定点数:通常是使用特定库中的decimal类型
    • 例如:使用decimal包存储10.99

整数表示法(推荐)

copy
// 以分为单位表示货币
type Money struct {
    Amount   int64
    Currency string
}

// 例如:¥10.99表示为:
money := Money{Amount: 1099, Currency: "CNY"}

2. 使用专门的decimal库

copy
import "github.com/shopspring/decimal"

type Money struct {
    Amount   decimal.Decimal
    Currency string
}

// 例如:¥10.99表示为:
amount := decimal.NewFromFloat(10.99)
money := Money{Amount: amount, Currency: "CNY"}

3. 使用货币专用库

有一些Go语言的第三方库专门用于处理货币:

copy
// 使用go-money库
import "github.com/Rhymond/go-money"

// 创建10.99人民币
money := money.New(1099, "CNY")

最佳实践

  1. 避免使用float类型:浮点数会有精度问题,不适合表示货币
  2. 推荐使用最小单位的整数:简单、准确、性能好
  3. 考虑国际化:添加货币代码(CNY、USD等)
  4. 处理舍入问题:明确定义舍入规则
  5. 进行单元测试:对所有货币计算进行充分测试

最终,选择以最小货币单位(如分)作为基准单位,并使用整数表示,是Golang中处理货币的最佳实践之一。


  • Claude 3.7 Sonnet
https://inasa.dev/posts/rss.xml