versiones guia español descargar actualizar python format floating-accuracy

python - guia - impresión de números con precisión constante o fija



qgis manual (3)

Si desea trabajar para cualquier cadena de longitud, necesita saber el recuento máximo de la cantidad de dígitos que estará antes del decimal:

def my_format(numbers): mxi = max(len(str(num).split(".")[0]) for num in numbers) for num in numbers: if isinstance(num, float): t = "{}".format(float("{:.2g}".format(num))) print(t.rjust((mxi + len(t.split(".")[-1]) + 1), " ")) else: print("{:{mx}}".format(num, mx=mxi)

Que debería alinearse para cualquier longitud:

In [10]: numbers = [ 1.193225, 1.0, 0, -1.0, 0.00344791, -0.00344791, 56188.5622, -56188.5622, 123456789, 12, 123] In [11]: my_format(numbers) 1.2 1.0 0 -1.0 0.0034 -0.0034 56000.0 -56000.0 123456789 12 123

Estos tres números 1.2, 0.0034, 56000 tienen todos una cosa en común: dos dígitos de precisión . Digamos que deseo informar el ancho de banda calculado de varios dispositivos muy diferentes que van desde kilobytes por segundo a gigabytes por segundo, todos los cuales varían hasta en un 10%. La manera más fácil para que mis lectores capten rápidamente los resultados es que convierta todo en una unidad común (digamos MB / s), alinee los puntos decimales,

1.2 0.0034 56000

y evite imprimir dígitos extraños; si mis valores computados son 1.193225, 0.00344791 y 56188.5622, entonces mis lectores solo necesitan ver lo anterior, el resto es ruido. A pesar de las amplias opciones de formato para los números de punto flotante, Python no parece tener una forma clara de imprimir números con una precisión fija . Cuál sería la mejor forma de hacer esto?

Una nota sobre cómo marcar esta pregunta: elegiré la mejor respuesta (es decir, simple, comprensible y elegante) sobre la primera respuesta. No necesitas apresurarte.


import math def round_s(n): if not n: return n e = int(math.floor(math.log10(abs(n)))) - 1 return round(n, -e) def fmt(n, size): return ''{n:{size}f}''.format(size=size, n=n).rstrip(''0'').rstrip(''.'') numbers = [ 1.193225, 1.0, 0, -1.0, 0.00344791, -0.00344791, 56188.5622, -56188.5622, ] for n in numbers: print ''{:12.5f} => {}''.format(n, fmt(round_s(n), 14))

Salida:

1.19322 => 1.2 1.00000 => 1 0.00000 => 0 -1.00000 => -1 0.00345 => 0.0034 -0.00345 => -0.0034 56188.56220 => 56000 -56188.56220 => -56000

Aqui tienes.


Combinaría dos respuestas de desbordamiento de pila (suponiendo que cada una es la mejor manera de realizar las dos mitades de esta tarea): Redondee a un número específico de cifras significativas y alinee los números usando el lenguaje de formateo

from math import log10, floor NUM_DIGITS = 2 # Number of significant digits # An example input number = 1.193225 # Round the number rounded = round(number, -int(floor(log10(number))) + (NUM_DIGITS - 1)) # Print aligned to the decimal point print(''{part[0]:>3}.{part[1]:<3}''.format(part=str(rounded).split(''.'')))

Debe ajustar los dos anchos en el formateador de cadenas para que sea al menos tan ancho como el entero más amplio y la parte decimal de los números. Las explicaciones completas se pueden encontrar en las respectivas páginas vinculadas.