¿Cómo puedo formatear un flotante para que no contenga ceros finales? En otras palabras, quiero que la cadena resultante sea lo más corta posible.
Por ejemplo:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
¿Cómo puedo formatear un flotante para que no contenga ceros finales? En otras palabras, quiero que la cadena resultante sea lo más corta posible.
Por ejemplo:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
3.14 == 3.140
- Son el mismo número de coma flotante. Por lo demás, 3.140000 es el mismo número de coma flotante. El cero no existe en primer lugar.%0.2f
y%0.3f
son los dos formatos requeridos para producir los últimos números a la izquierda. Use%0.2f
para producir los dos últimos números a la derecha.3.0 -> "3"
sigue siendo un caso de uso válido.print( '{:,g}'.format( X )
funcionó para mí para producir3
dóndeX = 6 / 2
y cuándoX = 5 / 2
obtuve una salida de2.5
lo esperado.print("%s"%3.140)
te da lo que quieres. (Respuestas:
Yo, lo haría
('%f' % x).rstrip('0').rstrip('.')
, garantiza el formato de punto fijo en lugar de la notación científica, etc. Sí, no es tan elegante y elegante como%g
, pero funciona (y no sé cómo forzar%g
a nunca usar la notación científica; -).fuente
'%.2f' % -0.0001
te dejará-0.00
y finalmente-0
.'f' Fixed point. Displays the number as a fixed-point number. The default precision is 6.
tendría que usar '% 0.7f' en la solución anterior.'%0.15f'
es una mala idea, porque comienzan a suceder cosas extrañas .print('In the middle {} and something else'.format('{:f}'.format(a).rstrip('0')))
rstrip
comando. Simplemente use esto en su lugar para quitar el punto (.
) y todos los ceros finales después en una sola operación:('%f' % x).rstrip('.0')
Podrías usar
%g
para lograr esto:o, para Python 2.6 o superior:
De los documentos para
format
:g
causas (entre otras cosas)fuente
'{0:...}'.format(value)
cuando podrías usarformat(value, '...')
? Eso evita tener que analizar el especificador de formato de una cadena de plantilla que, de lo contrario, está vacía.format(v, '2.5f')
~ 10% más que'{:2.5f}'.format(v)
. Incluso si no fuera así, tiendo a usar elstr
formulario de método porque cuando necesito modificarlo, agregarle valores adicionales, etc., hay menos para cambiar. Por supuesto, a partir de 3.6 tenemos cadenas f para la mayoría de los propósitos. :-)f"{var:g}"
dondevar
hay una variable flotante.¿Qué hay de intentar el enfoque más fácil y probablemente más efectivo? El método normalize () elimina todos los ceros finales más a la derecha.
Funciona en Python 2 y Python 3 .
-- Actualizado --
El único problema, como señaló @ BobStein-VisiBone, es que los números como 10, 100, 1000 ... se mostrarán en representación exponencial. Esto se puede solucionar fácilmente utilizando la siguiente función:
fuente
Decimal('10.0').normalize()
se convierte en'1E+1'
Después de buscar respuestas a varias preguntas similares, esta parece ser la mejor solución para mí:
Mi razonamiento:
%g
no se deshace de la notación científica.15 decimales parecen evitar comportamientos extraños y tienen mucha precisión para mis necesidades.
Podría haber usado en
format(inputValue, '.15f').
lugar de'%.15f' % inputValue
, pero eso es un poco más lento (~ 30%).Podría haberlo usado
Decimal(inputValue).normalize()
, pero esto también tiene algunos problemas. Por un lado, es MUCHO más lento (~ 11x). También descubrí que aunque tiene una precisión bastante grande, aún sufre pérdida de precisión cuando se usanormalize()
.Lo que es más importante, todavía me convertiría
Decimal
de unafloat
que puede hacer que termines con algo más que el número que pones allí. Creo queDecimal
funciona mejor cuando la aritmética permaneceDecimal
yDecimal
se inicializa con una cadena.Estoy seguro de que el problema de precisión
Decimal.normalize()
se puede ajustar a lo que se necesita usando la configuración de contexto, pero teniendo en cuenta la velocidad ya lenta y no necesita una precisión ridícula y el hecho de que todavía estaría convirtiendo de un flotador y perdiendo precisión de todos modos, no lo hice No creo que valiera la pena perseguirlo.No estoy preocupado con el posible resultado "-0" ya que -0.0 es un número de coma flotante válido y probablemente sea una ocurrencia rara de todos modos, pero como mencionó que desea mantener el resultado de la cadena lo más corto posible, usted siempre podría usar un condicional adicional a muy bajo costo de velocidad adicional.
fuente
floatToString(12345.6)
vuelve'12345.600000000000364'
por ejemplo. Disminuir el 15 en%.15f
un número menor lo resuelve en este ejemplo, pero ese valor debe reducirse cada vez más a medida que el número aumenta. Podría calcularse dinámicamente en función del log-base-10 del número, pero eso rápidamente se vuelve muy complicado.result = ('%15f' % val).rstrip('0').rstrip('.').lstrip(' ')
>>>12345.600000000000364 == 12345.6
True
Aquí hay una solución que funcionó para mí. Es una combinación de la solución de PolyMesh y el uso de la nueva
.format()
sintaxis .Salida :
fuente
3.141
), ya que.2f
está codificado.Simplemente puede usar format () para lograr esto:
format(3.140, '.10g')
donde 10 es la precisión que quieres.fuente
fuente
int(a) if a % 1 else a
?a if a % 1 else int(a)
es correcto. La pregunta necesita salida en cadena, así que acabo de agregarstr
a % 1
es verdad porque no es cero. Lo percibí implícita y erróneamente comoa % 1 == 0
.Si bien es probable que el formato sea la forma más pitónica, aquí hay una solución alternativa que usa la
more_itertools.rstrip
herramienta.El número se convierte en una cadena, que se despoja de los caracteres finales que satisfacen un predicado. La definición de la función
fmt
no es necesaria, pero se usa aquí para probar aserciones, que todas pasan. Nota: funciona en entradas de cadena y acepta predicados opcionales.Ver también los detalles en esta biblioteca de terceros,
more_itertools
.fuente
Si puede vivir con 3. y 3.0 que aparecen como "3.0", un enfoque muy simple que elimina los ceros a la derecha de las representaciones flotantes:
(gracias @ellimilial por señalar las excepciones)
fuente
print("%s"%3.0)
hace.Usar el paquete QuantiPhy es una opción. Normalmente, QuantiPhy se usa cuando se trabaja con números con unidades y factores de escala SI, pero tiene una variedad de buenas opciones de formato de números.
Y no usará la notación electrónica en esta situación:
Una alternativa que podría preferir es usar factores de escala SI, quizás con unidades.
fuente
OP desea eliminar los ceros superfluos y hacer que la cadena resultante sea lo más corta posible.
Encuentro que el formato exponencial% g acorta la cadena resultante para valores muy grandes y muy pequeños. El problema viene para valores que no necesitan notación exponencial, como 128.0, que no es ni muy grande ni muy pequeña.
Aquí hay una forma de formatear números como cadenas cortas que usa notación exponencial% g solo cuando Decimal.normalize crea cadenas que son demasiado largas. Es posible que esta no sea la solución más rápida (ya que utiliza Decimal.normalize)
fuente
Para flotar, puedes usar esto:
Pruébalo:
Para Decimal, vea la solución aquí: https://stackoverflow.com/a/42668598/5917543
fuente
"{:.5g}".format(x)
Lo uso para formatear flotadores para seguir ceros.
fuente
Aquí está la respuesta:
salida "3.14" y "3"
trim='-'
elimina tanto los ceros finales como el decimal.fuente
Utilice% g con ancho suficientemente grande, por ejemplo '% .99g'. Se imprimirá en notación de punto fijo para cualquier número razonablemente grande.
EDITAR: no funciona
fuente
.99
es precisión, no ancho; un poco útil, pero no puede establecer la precisión real de esta manera (aparte de truncarla usted mismo).Puedes usar
max()
así:print(max(int(x), x))
fuente
x
es negativo.if x < 0: print(min(x), x)
else : print(max(x), x)
Puede lograr eso de la manera más pitónica de esa manera:
python3:
fuente
Manejando% f y deberías poner
, donde: .2f == .00 flotantes.
Ejemplo:
imprimir "Precio:% .2f"% precios [producto]
salida:
Precio: 1.50
fuente