将字符串转换为双精度值时如何保持精度
问题描述:
s='[-97.173125220360362, -97.173125220360362]'
v=eval(s)
实际上V = [ - 97.17312522036036,-97.17312522036036],失去了最后的2.如何能保持相同的值以字符串
答
使用decimal
模块:
>>> import decimal
>>> decimal.Decimal('-97.173125220360362')
Decimal('-97.173125220360362')
对于列表大小写使用str.split
,str.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
模块。
答
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']
在这种情况下 - 更多的显示问题... '格式(float(their_string),'.17g'))'很好... –
对不起,其实我想在列表上工作。这就是为什么我使用'eval' – Samuel
@JonClements但是如果小数点后的数字位数未知的情况下呢? –