我正在使用 github.com/shopspring/decimal 进行货币操作(精确数字)
编组小数的最佳方法是什么。小数和解组并获得相同的值?
是一种将 decimal.Decimal 转换为字符串的方法吗?
谢谢
decimal.Decimal
实现了json.Marshaler
接口和json.Unmarshaler
接口。 json.Marshal()
调用它的 MarshalJSON
方法来生成 JSON;而 json.Unmarshal()
调用其 UnmarshalJSON
方法来解析 JSON 编码的数据。所以,你不需要明确地做。
decimal.Decimal
实现Stringer
接口。
因此,要将 转换为 字符串,其中
d
是一个 decimal.Decimal
:
s := d.String()
要从
字符串获得
decimal.Decimal
,使用decimal.NewFromString()
:
d, err := decimal.NewFromString(s)
if err != nil {
// handle err
}
还请注意,
decimal.Decimal
默认情况下将作为 string
编组为 JSON(即双引号表示)。 Un编组自动支持引用(字符串)或非引用(数字)值。
如果需要,可以通过将
decimal.MarshalJSONWithoutQuotes
设置为 true
来控制编组行为。例如如果与需要/期望 JSON 有效负载中的数字值的 API 交互。
这里有两点需要注意:
此设置会影响 all
decimal.Decimal
值的编组。似乎没有办法根据具体情况有选择地编组带/不带引号
没有引号的编组可能会导致精度的无声损失
无需“控制”un编组行为。
decimal.Decimal
将根据需要从(正确编码的)string
或 number
值中解组。
unmarshalling a
number
不会导致精度损失(除了由于原始编组 to 该数值而导致的任何损失)。