【问题标题】:Python Decimal to string produces strange scientific notationPython Decimal to string 产生奇怪的科学记数法
【发布时间】: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)

标签: python string decimal scientific-notation


【解决方案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 标记...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多