Python – número de dígitos en exponente

¿Es posible configurar el número de dígitos que se utilizarán para imprimir el exponente de un número de punto flotante? Quiero configurarlo a 3.

Actualmente,

f = 0.0000870927939438012 >>> "%.14e"%f '8.70927939438012e-05' >>> "%0.14e"%f '8.709279e-005' 

Lo que quiero imprimir es: '8.70927939438012e-005'

No hay una manera de controlar eso, la mejor manera es escribir una función para esto, por ejemplo,

 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) 

Salida:

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

Puedes usar 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' 

Aquí hay una respuesta un poco más flexible (ya sea 'e' o 'E' para separar la mantisa y el exponente, perdona los argumentos faltantes / malos). Pero estoy aumentando la respuesta de @AnuragUniyal porque esa respuesta es muy compacta.

 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) 

Ejemplos:

 >>> 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'