是否可以设置用于打印浮点数的指数的位数?我想把它设置为3。
目前,
f = 0.0000870927939438012
>>> "%.14e"%f
'8.70927939438012e-05'
>>> "%0.14e"%f
'8.709279e-005'
我想要打印的是:
'8.70927939438012e-005'
答案 0 :(得分:20)
没有办法控制它,最好的方法是为此编写一个函数。
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
答案 1 :(得分:5)
您可以使用np.format_float_scientific
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'
答案 2 :(得分:0)
这是一个稍微灵活的答案(使用'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'
答案 3 :(得分:0)
类似于@Anurag Uniyal答案,但可以选择删除指数中的符号(如果空间狭窄则很有用)。
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))