Python 3.x 如何在不降低精度的情况下将具有科学记数法的字符串转换为浮点?

Python 3.x 如何在不降低精度的情况下将具有科学记数法的字符串转换为浮点?,python-3.x,precision,Python 3.x,Precision,我有一个字符串,我需要把它转换成一个浮点数,以便处理 num = "2.769999999999999574e+00" 如果我做一个浮点运算,精度就消失了 print(float(num)) # 2.7699999999999996 from decimal import Decimal print(Decimal(num)) # 2.769999999999999574 如果我使用Decimal类,即使这样,精度也会消失 print(float(num)) # 2.76999999

我有一个字符串,我需要把它转换成一个浮点数,以便处理

num = "2.769999999999999574e+00"
如果我做一个浮点运算,精度就消失了

print(float(num))  # 2.7699999999999996
from decimal import Decimal
print(Decimal(num))  # 2.769999999999999574
如果我使用Decimal类,即使这样,精度也会消失

print(float(num))  # 2.7699999999999996
from decimal import Decimal
print(Decimal(num))  # 2.769999999999999574
似乎只有当提供的数字在第一位是浮点数时,十进制才能够保持精度

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

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

十进制(2.76999999999974E+00)不“保持精度”。它只会暴露问题。您指定的数字在内存中没有精确的位表示,并且在某种程度上是近似的,这说明了您在这里看到的扩展精度。这是您(和任何其他)CPU的限制<另一方面,代码>十进制(“2.76999999999574E+00”)实际上比传递实际浮动更准确地表示您的数量

你所说的“精度消失”是什么意思?将数字
2.76999999999574
转换为十进制,得到
2.76999999999574
。你期待什么?。它们只是没有显示。@user202729更新了代码。这里的2.76999999999574E+00是一个非常大的数字,我想保持它尽可能大,但保留“e”符号。目前只有Decimal可以给我一个非常大的数字,但只有当给定的数字不是字符串时。你确定吗?指数为e00。@cᴏʟᴅsᴘᴇᴇᴅ 我只拿其中一个数字为例。有带e02的数字等等。是的,我明白了,十进制实际上给出了比浮点数更正确的表示形式。