print - python float precision
Python-número de dígitos en exponente (3)
Aquí hay una respuesta un poco más flexible (ya sea ''e''
o ''E''
para separar la mantisa y el exponente, es perdonar 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''
¿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''