编组十进制。golang 中的十进制

问题描述 投票:0回答:2

我正在使用 github.com/shopspring/decimal 进行货币操作(精确数字)

编组小数的最佳方法是什么。小数和解组并获得相同的值?

是一种将 decimal.Decimal 转换为字符串的方法吗?

谢谢

json go decimal marshalling
2个回答
0
投票

decimal.Decimal
实现了
json.Marshaler
接口和
json.Unmarshaler
接口。
json.Marshal()
调用它的
MarshalJSON
方法来生成 JSON;而
json.Unmarshal()
调用其
UnmarshalJSON
方法来解析 JSON 编码的数据。所以,你不需要明确地做。


0
投票

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 交互。

这里有两点需要注意:

  1. 此设置会影响 all

    decimal.Decimal
    值的编组。似乎没有办法根据具体情况有选择地编组带/不带引号

  2. 没有引号的编组可能会导致精度的无声损失

无需“控制”un编组行为。

decimal.Decimal
将根据需要从(正确编码的)
string
number
值中解组。

unmarshalling a

number
不会导致精度损失(除了由于原始编组 to 该数值而导致的任何损失)。

© www.soinside.com 2019 - 2024. All rights reserved.