我应该如何最好地在Python中存储定点小数以获取加密货币?

Lud*_*udo 4 python django decimal

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

也许部分是由于对Python的Decimal的工作方式的细微差别没有完全的信心,部分是由于我对不同语言看到的建议,我认为将值存储为BigInteger字段中的satoshi equiv值可能更安全,例如0.00000008我存储8,对于4.10500008我存储410500008,对于6000.00000000我存储600000000000。

这是个好主意还是应该将Decimal与某些特定设置结合使用?

谢谢!

DrV*_*DrV 5

您可以安全地使用Decimal。它实际上是十进制,即没有基数转换错误。如果您存储

import decimal

d = decimal.Decimal('4.10500008')
Run Code Online (Sandbox Code Playgroud)

不会损失任何精度。

只需确保使用字符串创建数字,否则会遇到麻烦:

>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
Run Code Online (Sandbox Code Playgroud)

与:

>>> decimal.Decimal('1.1')
Decimal('1.1')
Run Code Online (Sandbox Code Playgroud)

要了解的另一件事是decimal.Decimal精度也要保持:

>>> decimal.Decimal('1.10')
Decimal('1.10')
Run Code Online (Sandbox Code Playgroud)

这对于财务应用程序非常有用。

有关更多信息,请参见:https : //docs.python.org/2/library/decimal.html

NB正如Mark Dickinson下面提醒,decimal模块不使用任意精度,显著数字的计算的数量是有限的。可以通过设置或查询此限制decimal.getcontext().prec,默认值为28。默认值对于常规的财务计算应该足够了(美国国债的低至十亿分之一美分),但是如果您需要更多,则可以设置它数量更多。