在Python中如何最佳存储固定点Decimal值用于加密货币?

4 投票
1 回答
1181 浏览
提问于 2025-04-18 13:10

我正在尝试开发一个Django/Python应用程序,用来存储和计算加密货币的价值。这些价值是小数,精确到小数点后8位,比如0.00000008、4.10500008和6000.00000000。

可能是因为我对Python的Decimal类型还不够了解,也可能是因为我看到过其他语言的建议,我在想把这些值存储为它们对应的satoshi(比特币的最小单位)值,放在一个BigInteger字段里会不会更安全。比如,对于0.00000008,我存8;对于4.10500008,我存410500008;对于6000.00000000,我存600000000000。

这样做是不是个好主意,还是说我应该用Decimal类型,并且设置一些特别的选项呢?

谢谢!

1 个回答

5

你可以安全地使用 Decimal。它实际上是十进制的,也就是说,不会出现进制转换错误。如果你存储

import decimal

d = decimal.Decimal('4.10500008')

就不会有精度损失。

只要确保你用字符串来创建这些数字,因为如果不这样做,你可能会遇到麻烦:

>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')

和:

>>> decimal.Decimal('1.1')
Decimal('1.1')

还有一个重要的事情要理解,就是 decimal.Decimal 也会保持精度:

>>> decimal.Decimal('1.10')
Decimal('1.10')

这在金融应用中非常有用。

想了解更多信息,可以查看: https://docs.python.org/2/library/decimal.html

注意:正如 Mark Dickinson 在下面提到的,decimal 模块并不使用任意精度,计算中的有效数字数量是有限的。这个限制可以通过 decimal.getcontext().prec 来设置或查询,默认值是 28。这个默认值对于一般的金融计算来说已经足够了(比如美国国债的精度可以到达亿分之一美分),但如果你需要更高的精度,可以把它设置成更大的数字。

撰写回答