【问题标题】:How to convert string having scientific notation to a float without loosing precision?如何在不损失精度的情况下将具有科学记数法的字符串转换为浮点数?
【发布时间】:2018-08-12 02:16:32
【问题描述】:

我有一个字符串需要转换为浮点数才能处理。

num = "2.769999999999999574e+00"

如果我做一个浮点操作,精度就没有了

print(float(num))  # 2.7699999999999996

如果我使用 Decimal 类,即使这样精度也没有了

from decimal import Decimal
print(Decimal(num))  # 2.769999999999999574

如果提供的数字首先是浮点数,Decimal 似乎只能保留精度

print(Decimal(2.769999999999999574e+00))  # 2.769999999999999573674358543939888477325439453125

如何在将数字从字符串转换为浮点数时保持精度?

【问题讨论】:

  • 您所说的“精度消失了”是什么意思?您将数字2.769999999999999574 转换为十进制并得到2.769999999999999574。你期待什么?
  • @user202729 更新了代码。这里 2.769999999999999574e+00 是一个非常大的数字,我想尽可能地保持它的大小,我可以保持 'e' 符号。目前只有十进制能够给出我是一个非常大的数字,但只有当给定的数字不是字符串时。
  • 你确定吗?指数为 e00。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我只以其中一个数字为例。有带e02的数字等等。

标签: python-3.x precision


【解决方案1】:

Decimal(2.769999999999999574e+00) 不“保持精度”。它只公开limitations of floating point arithmetic。您指定的数字在内存中没有精确的位表示,并且在某种程度上是近似的,说明您在此处看到的扩展精度。这是您(和任何其他)CPU 的限制。另一方面,Decimal("2.769999999999999574e+00") 实际上比传递实际浮点数更正确地表示您的数量。

【讨论】:

  • 是的,我明白了,Decimal 实际上给出了比浮点数更正确的表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多