什么是简单的方法来蜇转换成数学运算:从
:字符串转换为数字
['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04']
到:
[3.65e+03, 1.14e+04, 1.35e+04, 1.46e+04]
感谢。
什么是简单的方法来蜇转换成数学运算:从
:字符串转换为数字
['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04']
到:
[3.65e+03, 1.14e+04, 1.35e+04, 1.46e+04]
感谢。
首先,我希望您知道limitations在我们当前的体系结构中精确地表示浮点数。
转换的简单方法就是这样。
>>> s = ['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04']
>>> map(float,s)
>>> [3650.0, 11400.0, 13500.0, 14600.0]
但是float将它们舍入到最接近的值,只要值相同,它的表示就无关紧要。有时,这些值可以具有几乎相同的值,几乎相同的值,例如,
>>> s = ['3.65e+93', '1.14e+04', '1.35e+04', '1.46e+04']
>>> map(float,s)
[3.6500000000000001e+93, 11400.0, 13500.0, 14600.0]
更新 - 请参阅John Machin对此行为的评论/ repr。
但是,如果你想确切的表示,例如,如果您正在处理涉及金钱的计算,那么您可能需要使用Decimal
类型而不是浮点数,这对于所有用途而言可以与浮点数相同。
>>> from decimal import Decimal
>>> map(Decimal,s)
[Decimal('3.65E+93'), Decimal('1.14E+4'), Decimal('1.35E+4'), Decimal('1.46E+4')]
map(float, your_list)
或
[float(x) for x in your_list]
更新对于为什么不合格的建议“使用十进制”的解释是不是一个好主意,看到my answer to another question。
对于列表理解+1(通常在Python中更常见),并且在需要时允许使用if语句。顺便说一句,你打算链接到[这个答案](http://stackoverflow.com/questions/5683869/why-does-str-round-up-floats/5696968#5696968)? – 2011-04-21 02:51:24
@benhoyt:谢谢;链接现已修复。 – 2011-04-21 08:56:28
numbers = [eval(s) for s in ['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04']]
EVAL是一个黑客攻击的一位,但它很好保证工作。 (特定的浮点数也是一种好的方法。)
-1:假定字符串来自外部来源(命令行,文件,网络等)。盲目使用''eval()''是一个巨大的风险,因为它允许任意代码被执行。甚至为了降低这种安全风险,为什么要在内置的专门为此设计的float()函数中使用''eval()''? – Blair 2011-04-21 09:47:31
+1使用十进制 – lecodesportif 2011-04-20 22:18:10
-1您很困惑:'float()'总是舍入到最接近的float值,如果有必要的话。 “如你所见”??你的第一个map()输出中没有ROUNDOFF。在你的第二部分中,'3.6500000000000001e + 93'仅仅是你使用2.7以前版本Python的工具,其中'repr()'总是使用17位精度的十进制数字。 Python 2.7生成'3.65e + 93'。在任何Python中,'3.6500000000000001e + 93 == 3.65e + 93'都是真的。引入具有其自身有限精度的“小数”是非常不稳固的理由。 – 2011-04-20 22:30:22
约翰 - 感谢您的解释和纠正。我在我的答案中更新了几个部分。至于Decimal的精度,它可以用'getcontext()来控制。prec = n'不是吗? – 2011-04-20 23:09:22