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与某些特定设置结合使用?
谢谢!
您可以安全地使用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。默认值对于常规的财务计算应该足够了(美国国债的低至十亿分之一美分),但是如果您需要更多,则可以设置它数量更多。