使用什么类型来正确处理奇数美分的划分? (或任何货币的最小单位)
What type to use to correctly handle division of odd numbers of cents? (or smallest units of any currency)
大多数时候,我看到的建议是将金钱作为其最基本的单位;并使用 64 位无符号整数来提供最大容量。
从表面上看,这似乎很好,但是我想拆分 1 cent 的情况呢?
在 Java/Scala 中,BigDecimal 类型(我也看到推荐用于处理货币)将跟踪一美分的分数,0.01/2 = 0.005
但是除以一个64位unsigned int,1/2 = 0
我正在尝试编写一些处理金钱的 Go,想知道使用哪种类型(只使用 uint64 还是找其他东西?)。
谢谢!
您可以对任意大小的有理数使用 big.Rat
。然后,您可以根据自己的喜好拆分数量,而不会丢失任何精度。
int64
(或uint64
)仍然可以用分数表示货币金额。例如。如果您要操作的最低金额是 0.01
美分,那么您可以将 1
美分表示为 100
,那么半美分将是 50
和 1/100
一美分将是 1
。这种表示非常有效(从性能和内存使用的角度来看)但不是很灵活。需要注意的事项是:
- 您可以使用此方法表示最大值(
~2^64/100
美分)
- 如果最大精度发生变化,则需要对应用程序及其存储的数据进行更改
- 所有算术运算都需要谨慎执行,并考虑到舍入
大多数时候,我看到的建议是将金钱作为其最基本的单位;并使用 64 位无符号整数来提供最大容量。
从表面上看,这似乎很好,但是我想拆分 1 cent 的情况呢?
在 Java/Scala 中,BigDecimal 类型(我也看到推荐用于处理货币)将跟踪一美分的分数,0.01/2 = 0.005
但是除以一个64位unsigned int,1/2 = 0
我正在尝试编写一些处理金钱的 Go,想知道使用哪种类型(只使用 uint64 还是找其他东西?)。
谢谢!
您可以对任意大小的有理数使用 big.Rat
。然后,您可以根据自己的喜好拆分数量,而不会丢失任何精度。
int64
(或uint64
)仍然可以用分数表示货币金额。例如。如果您要操作的最低金额是 0.01
美分,那么您可以将 1
美分表示为 100
,那么半美分将是 50
和 1/100
一美分将是 1
。这种表示非常有效(从性能和内存使用的角度来看)但不是很灵活。需要注意的事项是:
- 您可以使用此方法表示最大值(
~2^64/100
美分) - 如果最大精度发生变化,则需要对应用程序及其存储的数据进行更改
- 所有算术运算都需要谨慎执行,并考虑到舍入