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'。如何构造 Decimald 实例 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'

我相信区别在于00.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

convert decimal to binary

反序列化Newtonsoft.Json.JsonReaderException:“Could not convert string to decimal: . Path 'SETTLEAMT&

convert decimal to binary using inbuilt function

go使用decimal

166. Fraction to Recurring Decimal