科学计数法格式化

20
如何获得以下格式(输入值始终小于0.1):
> formatting(0.09112346)
0.91123E-01
> formatting(0.00112346)
0.11234E-02

等等。

我正在寻找一些优雅的解决方案。我已经在使用下面给出的自定义函数:

def formatting(x, prec=5):
    tup    = x.as_tuple()
    digits = list(tup.digits[:prec])
    dec    = ''.join(str(i) for i in digits)
    exp    = x.adjusted()
    return '0.{dec}E{exp}'.format(dec=dec, exp=exp)

你的意思是在打印数字时如何获得特定的符号吗? - toti08
我认为是的。(我对“特定符号”的概念不是很清楚。) - ARK4579
是的,抱歉,我的意思是使用不同的表示法打印数字,例如指数表示法,或者仅指定逗号后的一定数量的数字等等... - toti08
3个回答

18
你可以使用format()函数。格式规范在其中提到:

'E' - 指数符号。与'e'相同,只是它使用大写的'E'作为分隔符。

>>> print('{:.5E}'.format(0.09112346))
9.11235E-02
>>> print('{:.5E}'.format(0.00112346))
1.12346E-03

然而,这与您在答案中的输出并不完全相同。如果上述内容不令人满意,则可以使用自定义函数来帮助(我不是最擅长此项任务,所以希望您能理解):

def to_scientific_notation(number):
    a, b = '{:.4E}'.format(number).split('E')
    return '{:.5f}E{:+03d}'.format(float(a)/10, int(b)+1)

print(to_scientific_notation(0.09112346))
# 0.91123E-01
print(to_scientific_notation(0.00112346))
# 0.11234E-02

是的,抱歉,那不是我想要的输出结果。我已经在我的回答中使用了自定义函数。 - ARK4579
3
抱歉,您是否阅读完整个回答?第二部分提供了您要求的格式(0.91123E-01和0.11234E-02),我是否漏掉了什么? - Jerry
1
是的,谢谢。 :) 但我已经在使用自定义函数了。 :) - ARK4579

11
在Python 3.6及以上版本中,你也可以使用f-strings。例如:
In [31]: num = 0.09112346

In [32]: f'{num:.5E}'
Out[32]: '9.11235E-02'

它使用与 str.format() 相同的语法,该语法在 格式规范迷你语言 部分给出。

编辑:

f'{num:.5E}'始终以标准化科学计数法返回数字,这意味着返回数字[m]E[n]中绝对值为m(尾数)始终在1到10之间。

如果您想要强制绝对值的尾数(m)介于0.1和1之间(0.1 <= |m| < 1.0),那么您必须使用自定义解决方案。


0

另一种格式化规范科学记数法的语法选项:

number = 0.09112346
string = '%.5E' % number
# 9.11235E-02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接