print - Python Scientific Notation precisión normalización
print float python (3)
Puede especificar la precisión en el formato:
print ''{:.2e}''.format(float(input))
Esto siempre dará 2 decimales de precisión. La cantidad de precisión que desee debe ser determinada por usted mismo. Si necesitas ayuda con esa publicación en los comentarios.
Mi objetivo es simplemente convertir una cadena como "1.2" a notación científica sin agregar precisión adicional. El problema es que siempre termino con 0 superfluos al final de mi salida.
>>> input = "1.2"
>>> print ''{:e}''.format(float(input))
1.200000e+00
Estoy tratando de averiguar cómo obtener sólo 1.2e+00
. Me doy cuenta de que puedo especificar la precisión en mi declaración de formato, pero no quiero truncar cadenas innecesariamente. Solo quiero suprimir los entrenamientos 0s.
He intentado usar Decimal.normalize (), que funciona en todos los casos, excepto donde e <2.
>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12
Así que eso es mejor, excepto que no quiero 12, quiero 1.2e + 1. :PAG
Cualquier sugerencia sería muy apreciada!
Edición: para aclarar, el valor de entrada ya se ha redondeado adecuadamente a una longitud predeterminada que ahora se desconoce. Estoy tratando de evitar volver a calcular la precisión de formato apropiado.
Básicamente, podría tener valores de entrada de "1.23" y "1234.56", que deberían aparecer como "1.23e + 0" y "1.23456e + 3".
Puede que tenga que verificar cuánto tiempo dura la cadena de entrada y usarla para especificar una precisión manualmente, pero quería verificar y asegurarme de que no me faltara algo que pudiera evitar que el formato exponencial agregue 0s arbitrariamente.
Solo volviendo y limpiando viejas preguntas. Terminé resolviendo esto escribiendo una pequeña función para intuir la precisión inicial de un número y luego usándolo para formatear el resultado de salida.
#used to determine number of precise digits in a string
def get_precision(str_value):
vals = str_value.split(''.'')
if (vals[0] == ''0''):
return len(vals[1])
else:
return len(str_value) -1
# maintain same precision of incoming string on output text
class ExpDecorator(CurrencyDecorator):
def get_text(self):
text = self.decoratedCurrency.get_text()
return (''{:.'' + str(get_precision(text)-1) + ''e}'').format(float(text))
No es realmente la solución más elegante, pero para empezar la tarea era algo desagradable y cumplió con su cometido.
Tomó un poco de ajustar la solución de Alex, pero escribí una función que eliminaría todos los ceros finales de cualquier número en Python.
def remove_trailing_zeros(value):
value = str(value)
if value.find(''e'') != -1:
vals = value.split(''e'')
e = vals[1]
return ''{:g}''.format(float(vals[0]))+''e''+e
vals = value.split(''.'')
if (vals[0] == ''0''):
i = 0
while vals[1][i] == ''0'':
i += 1
return ''{:.{}e}''.format(float(value), len(vals[1][i:]) - 1)
else:
j = len(vals[0]) - 1
while vals[0][j] == ''0'':
j -= 1
return ''{:.{}e}''.format(float(value), len(vals[0][:j]))