将字符串转换为double值时如何保持精度

时间:2013-10-28 09:48:53

标签: python

例如。

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

实际上v = [ - 97.17312522036036,-97.17312522036036],丢失了最后的2.如何用字符串保持相同的值

3 个答案:

答案 0 :(得分:4)

使用decimal模块:

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

对于包含列表案例的字符串,请使用str.splitstr.strip和列表理解:

>>> s = '[-97.173125220360362, -97.173125220360362]'
>>> [decimal.Decimal(x) for x in s.strip('[]').split(',')]
[Decimal('-97.173125220360362'), Decimal('-97.173125220360362')]

来自docs

>> 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模块。

答案 1 :(得分:1)

使用ast.literal_eval

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

正如文档所述,使用ast.literal_evaleval更安全。

这将为您提供浮动列表。

答案 2 :(得分: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']