Python 指数中的位数

Python 指数中的位数,python,floating-point,exponent,Python,Floating Point,Exponent,是否可以设置用于打印浮点数指数的位数?我想把它设为3 目前, f = 0.0000870927939438012 >>> "%.14e"%f '8.70927939438012e-05' >>> "%0.14e"%f '8.709279e-005' 我想打印的是: '8.70927939438012e-005'无法控制,最好的方法是为此编写一个函数,例如 def eformat(f, prec, exp_digits): s = "%.*e"%(pr

是否可以设置用于打印浮点数指数的位数?我想把它设为3

目前,

f = 0.0000870927939438012
>>> "%.14e"%f
'8.70927939438012e-05'
>>> "%0.14e"%f
'8.709279e-005'
我想打印的是:
'8.70927939438012e-005'

无法控制,最好的方法是为此编写一个函数,例如

def eformat(f, prec, exp_digits):
    s = "%.*e"%(prec, f)
    mantissa, exp = s.split('e')
    # add 1 to digits as 1 is taken by sign +/-
    return "%se%+0*d"%(mantissa, exp_digits+1, int(exp))

print eformat(0.0000870927939438012, 14, 3)
print eformat(1.0000870927939438012e5, 14, 3)
print eformat(1.1e123, 4, 4)
print eformat(1.1e-123, 4, 4)
输出:

8.70927939438012e-005
1.00008709279394e+005
1.1000e+0123
1.1000e-0123

这里有一个稍微灵活一点的答案(可以用
'e'
'e'
来分隔尾数和指数,这就是原谅遗漏/错误的参数)。但我对@AnuragUniyal的答案投了赞成票,因为这个答案非常简洁

def efmte(x, n=6, m=2, e='e', nmax=16):
    def _expc(s): # return exponent character of e-formatted float
        return next(filter(lambda character: character in {'E', 'e'}, s))
    def _pad0(s, n): # return string padded to length n
        return ('{0:0>' + str(n) + '}').format(s)
    def _efmtes(s, n): # reformat e-formatted float: n e-digits
        m, e, p = s.partition(_expc(s)) # mantissa, exponent, +/-power
        return m + e + p[0] + _pad0(p[1:], n)
    def _efmt(x, n, e): # returns formatted float x: n decimals, 'e'/'E'
        return ('{0:.' + str(n) + e + '}').format(x)
    x = x if isinstance(x, float) else float('nan')
    nmax = 16 if not isinstance(nmax, int) else max(0, nmax)
    n = 6 if not isinstance(n, int) else min(max(0, n), nmax)
    m = 2 if not isinstance(m, int) else max(0, m)
    e = 'e' if e not in {'E', 'e'} else e
    return _efmtes(_efmt(x, n, e), m)
示例:

>>> efmte(42., n=1, m=5)
'4.2e+00001'
>>> efmte('a')
'-1.#IND00e+00'
>>> # Yuck: I was expecting 'nan'. Anyone else?
>>> from math import pi
>>> efmte(pi)
'3.141593e+00'
>>> efmte(pi, m=3)
'3.141593e+000'
你可以用


与@Anurag Uniyal answer类似,但可以选择删除指数中的符号(如果指数的空间很紧,则很有用)


为什么第二个示例精度较低,指数为3位?在我的机器“%e”%f输出“8.709279e-05”和“%0.14e”%f输出“8.70927939438012e-05”上。此外,使用诸如mpmath之类的库应该可以获得更高的精度。但是,我不知道它是否符合您的需要。Anurag,有多种方法可以将其作为字符串处理并获取指数中的三位数。我感兴趣的是避免字符串操作,因为我文章中的第二个示例显示Python在某些情况下本机使用三位数。还是不知道为什么会这样,正如你在上面也问过的。我只是在实验时发现的。@nmadzharov我不认为有任何公共函数用于此,您应该尝试查看python代码,看看它实际上在做什么,尽管我在python 2上没有看到3位数的指数。7@Anurag:Python 2.5的某些平台上确实出现了三位数的指数;这是在Python2.6中修复的(我相信)。更多信息请参阅。我很遗憾这个答案是正确的,如果您能指定数字的数量,那当然很好。。。几乎被否决了。。。
from numpy import format_float_scientific

f = 0.0000870927939438012

format_float_scientific(f, exp_digits=3) # prints '8.70927939438012e-005'

format_float_scientific(f, exp_digits=5, precision=2) #prints '8.71e-00005'
def expformat(f, prec, exp_digits, sign='on'):
    """Scientific-format a number with a given number of digits in the exponent.
    Optionally remove the sign in the exponent"""
    s = "%.*e"%(prec, f)
    mantissa, exp = s.split('e')
    if (sign=='on') :
        # add 1 to digits as 1 is taken by sign +/-
        return "%se%+0*d"%(mantissa, exp_digits+1, int(exp))
    else :
        return "%se%0*d"%(mantissa, exp_digits, int(exp))