我正在开发一个Django / Python应用程序,用于存储和计算加密货币值。这些是小数点到8位小数,例如,0.00000008,4.10500008,6000.00000000。
也许部分原因是没有充分相信Python的Decimal如何工作的细微差别,部分来自于我在不同语言中看到的建议,我认为将值存储为BigInteger字段中的satoshi等值可能更安全例如,对于0.00000008我存储8,对于4.10500008我存储410500008和对于6000.00000000我存储600000000000。
这是一个好主意还是我应该使用Decimal而不是某些特定设置?
谢谢!
答案 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.默认值应足以进行常规财务计算(美国国债减少至十亿分之一美分),但如果您需要更多,您可以将其设置为更大的数字。