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.