例如 。
s='[-97.173125220360362, -97.173125220360362]'
v=eval(s)
实际上 v =[-97.17312522036036, -97.17312522036036],丢失了最后 2 个。我怎样才能与字符串保持相同的值
例如 。
s='[-97.173125220360362, -97.173125220360362]'
v=eval(s)
实际上 v =[-97.17312522036036, -97.17312522036036],丢失了最后 2 个。我怎样才能与字符串保持相同的值
使用decimal
模块:
>>> import decimal
>>> decimal.Decimal('-97.173125220360362')
Decimal('-97.173125220360362')
对于带有列表 case usestr.split
和str.strip
列表理解的字符串:
>>> s = '[-97.173125220360362, -97.173125220360362]'
>>> [decimal.Decimal(x) for x in s.strip('[]').split(',')]
[Decimal('-97.173125220360362'), Decimal('-97.173125220360362')]
来自文档:
>> import sys
>>> sys.float_info.dig
15
>>> s = '3.14159265358979' # decimal string with 15 significant digits
>>> format(float(s), '.15g') # convert to float and back -> same value
'3.14159265358979'
但是对于超过sys.float_info.dig
有效数字的字符串,这并不总是正确的:
>>>
>>> s = '9876543211234567' # 16 significant digits is too many!
>>> format(float(s), '.16g') # conversion changes value
'9876543211234568'
因此,如果您想保持包含多于sys.float_info.dig
位数的浮点数的精度,请使用decimal
模块。
import ast
s = '[-97.173125220360362, -97.173125220360362]'
print ast.literal_eval(s)
正如文档所述,使用ast.literal_eval
比 更安全。eval
这将为您提供浮动列表。
这更像是一个显示问题,要获取您的列表,请改用literal_eval:
from ast import literal_eval
s= '[-97.173125220360362, -97.173125220360362]'
items = literal_eval(s)
# [-97.17312522036036, -97.17312522036036]
然后显示,适当地格式化:
as_strings = [format(el, '.17g') for el in items]
# ['-97.173125220360362', '-97.173125220360362']