将负科学记数法 1.3E-2 转换为浮点数?
Posted
技术标签:
【中文标题】将负科学记数法 1.3E-2 转换为浮点数?【英文标题】:convert negative scientific notation 1.3E-2 to float? 【发布时间】:2019-01-31 13:34:23 【问题描述】:我知道我可以使用float
将科学计数法中的数字转换为浮点数,如下所示:
>>> x = 1.3e8
>>> float(x)
130000000.0
那么,为什么我不能用负指数做同样的事情呢?
>>> x = 1.3e-8
>>> x
1.3e-08
>>> float(x)
1.3e-08
我本来希望float(x)
在最后一种情况下给0.000000013
【问题讨论】:
需要注意的是1.3e-08
是一个浮点数。区别仅在于打印方式。
0.000000013 == 1.3e-8
是 True
。这个问题似乎很奇怪。在您的任何一种情况下,float(x)
实际上都没有做任何事情。
你可以使用format(x, '.9f')
。
当然,问题应该是“如何在不使用科学记数法的情况下像浮点数一样打印”。为混乱道歉。我知道这是一个浮标!感谢以下所有答案。所以@JohnColeman 更奇怪的是:我的问题还是上面示例中 python 的行为方式? ;-) 为什么它应该以正指数打印一种方式,而以另一种方式打印负指数?同样,我知道数字是相同的,但是,只是...*为什么*?
@FlorianOswald 好问题。也许正指数的基本原理是这样的数字应该有一个看起来像他们四舍五入的整数的表示。对于具有负指数的数字,它们通常四舍五入为 0,因此这不是很有帮助。
【参考方案1】:
1.3e-8
是一个浮点字面量(即它直接创建一个float
对象),因此您不需要将它包装在float()
中。 Python shell 只返回浮点数的默认字符串表示。要强制使用定点表示法,您可以使用str.format()
,但您可能需要指定精度:
>>> ':.9f'.format(1.3e-8)
'0.000000013'
【讨论】:
这适用于这种特定情况,但1.3e-12
如果你知道最大精度,你可以这样做:':.20f'.format(1.3e-8).rstrip('0')
值得一提【参考方案2】:
它已经是一个浮点数,它只是以科学计数法表示
print(type(1.3e8)) # <class 'float'>
print(type(1.3e-8)) # <class 'float'>
print(0.000000013) # 1.3e-08
【讨论】:
预期的问题可能是找到一种使用非科学记数法打印浮点数的方法。 @YannickBuehler 可能是这种情况【参考方案3】:以下函数处理任意数量的浮点数。
def displayfloat(x):
# format numbers > 1.
if str(x).find('+') > -1:
return ':.1f'.format(x)
e_idx = str(x).find('e')
# format numbers > 1e-05
if e_idx == -1:
return str(x)
# format numbers < 1e-05
minus_idx = str(x).find('-')
shift = e_idx
if str(x).find('.') > -1:
shift -= 1
decimalpoints = -int(str(x)[str(x).find('-'):]) - 1 + shift
floatformat = ':.'+str(decimalpoints)+'f'
return floatformat.format(x)
# exmaples
displayfloat(1e-5) # --> '0.00001'
displayfloat(1.1e-5) # --> '0.000011'
displayfloat(1e+5) # --> '100000.0'
【讨论】:
以上是关于将负科学记数法 1.3E-2 转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas / 如何将存储为字符串的科学记数法转换为浮点数?