我有一个像这样列表的字符串
list_str = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]'
然后我使用 eval() 将其转换为 Python 中的真实列表对象
print eval(list_str)
但是,输出是我不想要的四舍五入
0 = {float} 148654.084259
1 = {float} 148656.999942
2 = {float} 148658.082292
3 = {float} 148661.00206
我怎样才能让它保持字符串中的值(精确的十进制)?
我需要使用 eval(),因为它也会使用此列表上的其他操作
最佳答案
float
由二进制分数表示,在与您正在使用的点分十进制表示形式( see here )进行相互转换时,会出现精度损失。 python decimal
package实现十进制浮点运算并且没有这个限制。
您不能使用 eval
来分解列表,因为这些值将计算为 float ,但您可以使用正则表达式包提取 float 并从那里构建列表。
>>> import decimal
>>> import re
>>> list_str = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]'
>>> items = [decimal.Decimal(x) for x in re.findall(r'\d+\.?\d*', list_str)]
>>> items
[Decimal('148654.08425925925'), Decimal('148656.99994212962'), Decimal('148658.08229166668'), Decimal('148661.0020601852')]
>>>
关于Python如何计算一个精确到小数的列表字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42348682/