我应该如何最好地在Python中存储用于加密货币的定点十进制值?

时间:2014-07-13 21:23:12

标签: python django decimal

我正在开发一个Django / Python应用程序,用于存储和计算加密货币值。这些是小数点到8位小数,例如,0.00000008,4.10500008,6000.00000000。

也许部分原因是没有充分相信Python的Decimal如何工作的细微差别,部分来自于我在不同语言中看到的建议,我认为将值存储为BigInteger字段中的satoshi等值可能更安全例如,对于0.00000008我存储8,对于4.10500008我存储410500008和对于6000.00000000我存储600000000000。

这是一个好主意还是我应该使用Decimal而不是某些特定设置?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以安全地使用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

N.B。正如Mark Dickinson提醒的那样,decimal模块不使用任意精度,计算中有效数字的数量是有限的。此限制可由decimal.getcontext().prec设置或查询,默认值为28.默认值应足以进行常规财务计算(美国国债减少至十亿分之一美分),但如果您需要更多,您可以将其设置为更大的数字。