Python Decimal to string 产生奇怪的科学记数法
Posted
技术标签:
【中文标题】Python Decimal to string 产生奇怪的科学记数法【英文标题】:Python Decimal to string produces strange scientific notation 【发布时间】:2015-02-13 15:38:39 【问题描述】:我正在处理一个错误,将str
函数应用于decimal.Decimal
的实例会给我字符串'0E-1000'
。我希望将str
应用于Decimal
总是会给我一个-?[0-9]+(\.[0-9]+)
形式的字符串,这正是我想要的。
首先,如果我理解正确,科学记数法'0E-1000'
代表0 x 10^-1000,即零。为什么我会得到这种特殊的零表示?为什么不是'0E-42'
,也一样?
其次,我无法手动构造一个重现此错误的Decimal
。错误的Decimal
实例来自外部来源。在 REPL 中,表达式 str(Decimal(0))
的计算结果为 '0'
。如何构造 Decimal
的 d
实例 str(d)
评估为 '0E-1000'
?
编辑:第三,如何将任意 Decimal
实例转换为字符串,你知道,十进制符号?
【问题讨论】:
这个数字是从哪里来的? 它来自 Django 模型中的一个字段。该字段定义为models.DecimalField(max_digits=1000, decimal_places=1000, blank=True, null=True)
。
【参考方案1】:
如果你想重现你的小数,只需从字符串构造它:
>>> d=decimal.Decimal("0E-1000")
>>> str(d)
'0E-1000'
我相信区别在于0
和0.00000
(或者在您的情况下是1000 个零)之间的区别,这就是准确性。这在科学情况下可能很重要,其中舍入等由操作数的精度控制。如果要打印一致,请使用decimal.Decimal.normalize
:
>>> d=decimal.Decimal("0E-1000")
>>> d
Decimal('0E-1000')
>>> d.normalize()
Decimal('0')
>>> str(d.normalize())
'0'
【讨论】:
啊,normalize
有帮助!奇怪的。我希望所有标准化的小数都会自动标准化。必须处理同一数据类型中同一数字的多个等效表示是很奇怪的。 (我还必须弄清楚这个“精确”的东西,它是由一些可怕的全局上下文指定的......)
decimal.localcontext 可以保持全局 velociraptors 远离。只是将缩进进一步推向 80 char PEP8 标记...以上是关于Python Decimal to string 产生奇怪的科学记数法的主要内容,如果未能解决你的问题,请参考以下文章
Linked List Cycle II & Reverse Words in a String & Fraction to Recurring Decimal
反序列化Newtonsoft.Json.JsonReaderException:“Could not convert string to decimal: . Path 'SETTLEAMT&