0

例如 。

s='[-97.173125220360362, -97.173125220360362]'
v=eval(s)

实际上 v =[-97.17312522036036, -97.17312522036036],丢失了最后 2 个。我怎样才能与字符串保持相同的值

4

3 回答 3

4

使用decimal模块:

>>> import decimal
>>> decimal.Decimal('-97.173125220360362')
Decimal('-97.173125220360362')

对于带有列表 case usestr.splitstr.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模块。

于 2013-10-28T09:50:21.240 回答
1

使用ast.literal_eval

import ast
s = '[-97.173125220360362, -97.173125220360362]'
print ast.literal_eval(s)

正如文档所述,使用ast.literal_eval比 更安全。eval

这将为您提供浮动列表。

于 2013-10-28T09:56:12.417 回答
1

这更像是一个显示问题,要获取您的列表,请改用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']
于 2013-10-28T09:57:26.883 回答