Convierta el número de coma flotante con cierta precisión y luego cópielo en una cadena

144

Tengo un número de coma flotante, por ejemplo 135.12345678910. Quiero concatenar ese valor a una cadena, pero solo quiero 135.123456789. Con print, puedo hacer esto fácilmente haciendo algo como:

print "%.9f" % numvar

con numvarser mi número original ¿Hay una forma fácil de hacer esto?

pauliwago
fuente
3
% hace exactamente eso -% no es parte de la función de impresión sino de cadena - ver documentos de Python
michael_s

Respuestas:

177

Con Python <3 (por ejemplo, 2.6 [ver comentarios] o 2.7), hay dos formas de hacerlo.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Pero tenga en cuenta que para las versiones de Python anteriores a 3 (por ejemplo, 3.2 o 3.3), se prefiere la opción dos .

Para obtener más información sobre la opción dos, sugiero este enlace sobre el formato de cadenas de la documentación de Python .

Y para obtener más información sobre la opción uno, este enlace será suficiente y tiene información sobre las diferentes banderas .

Python 3.6 (lanzado oficialmente en diciembre de 2016), agregó el fliteral de cadena, vea más información aquí , que amplía el str.formatmétodo (uso de llaves para f"{numvar:.9f}"resolver el problema original), es decir,

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

resuelve el problema Consulte la respuesta de @ Or-Duan para obtener más información, pero este método es rápido .

HAL 9001
fuente
1
la opción dos debería ser newer_method_string = "{:.9f}".format(numvar): tenga en cuenta lo necesario :para separar el campo y el formato. He probado esto en 2.7.5 de todos modos.
Caltor
1
Para python 2.6, la opción dos debería ser newer_method_string = "{0:.9f}".format(numvar): tenga en cuenta el 0 requerido para field_name para esta versión anterior.
ttq
56

Python 3.6

Solo para que quede claro, puedes usar f-string formato . Esto tiene casi la misma sintaxis que el formatmétodo, pero lo hace un poco más agradable.

Ejemplo:

print(f'{numvar:.9f}')

Más información sobre la nueva cadena f:

Aquí hay un diagrama de los tiempos de ejecución de los diversos métodos probados (del último enlace anterior):

tiempos de ejecución

O Duan
fuente
52

Utilizando round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
shantanoo
fuente
8

No es la impresión la que formatea, es una propiedad de cadenas, por lo que puede usar

newstring = "%.9f" % numvar
John La Rooy
fuente
O use el nuevo formato de estilo. valueString = "{:. 9f}". format (número)
Zaren
8

En caso de que la precisión no se conozca hasta el tiempo de ejecución, esta otra opción de formato es útil:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
Yu Hao
fuente
3
Si prefiere utilizar .format-method, nota que esto también se puede hacer mediante argumentos de anidación de esta manera: '{:.{n}f}'.format(numvar,n=n).
nivk
2

Para establecer la precisión con 9 dígitos, obtenga:

print "%.9f" % numvar

Precisión de retorno con 2 dígitos:

print "%.2f" % numvar 

Precisión de retorno con 2 dígitos y valor convertido flotante:

numvar = 4.2345
print float("%.2f" % numvar) 
Tanque Tejas
fuente
-2

La strfunción tiene un error. Por favor intenta lo siguiente. Verá '0,196553' pero la salida correcta es '0,196554'. Porque el strvalor predeterminado de la función es ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")
etemsulano
fuente
2
¿Qué pasa con .frente ,? ¿Y cómo es relevante para la pregunta de pauliwago?
Peter Mortensen