Necesito para imprimir o convertir un flotador número 15 decimal string, incluso si el resultado tiene muchos tirados 0s por ejemplo:

1.6 se convierte en 1.6000000000000000

Traté de ronda(6.2,15), pero devuelve 6.2000000000000002 la adición de un error de redondeo

También vi a varias personas en línea que ponen el flotador en una cadena y luego añadió trailing 0 de forma manual, pero que parece mal…

¿Cuál es la mejor manera de hacer esto?

  • Nota de lado, pero que el pasado 2 no es un error de redondeo exactamente. El número 6.2, como muchos otros de los números reales, no es exactamente representable con una variable de coma flotante en un equipo. Consulte docs.python.org/tutorial/floatingpoint.html y stackoverflow.com/questions/1089018/… para más información.
  • Creo que se podría salirse con la llamada es un error de redondeo – la entrada es ser redondeado al más cercano número binario.

3 Comentarios

  1. 61

    Para las versiones de Python en 2.6+ y 3.x

    Puede utilizar el str.formato método. Ejemplos:

    >>> print('{0:.16f}'.format(1.6))
    1.6000000000000001
    
    >>> print('{0:.15f}'.format(1.6))
    1.600000000000000

    Nota la 1 al final de el primer ejemplo es el error de redondeo; esto sucede porque representación exacta del número decimal 1.6 requiere de un infinito número de dígitos binarios. Puesto que los números de punto flotante tienen un número finito de bits, el número se redondea a un lugar cercano, pero no son iguales, el valor.

    Para las versiones de Python antes de 2.6 (al menos a 2.0)

    Usted puede utilizar el «modulo-formato de sintaxis» (esto funciona para Python 2.6 y 2.7 demasiado):

    >>> print '%.16f' % 1.6
    1.6000000000000001
    
    >>> print '%.15f' % 1.6
    1.600000000000000
    • +1. Esta respuesta obras en >= Python 2.7. En Python 2.6 sería '{0:.16f}'.format(x), no estoy seguro acerca de la edad de Python.
    • Buen punto. El «módulo de formato» (por ejemplo, '%.16f' % 1.6) funciona al menos a Python 2.0 (Python 2.0 Formato de Cadena de Operaciones).
    • tengo un extraño error cuando intento del código anterior: # Error: ValueError: zero length field name in format #
    • Que versión de Python que tiene? Como @mtrw señaló en un comentario anterior, si usted tiene Python 2.6, usted necesita el argumento posicional (el 0 en el código de ese comentario). Esto también es cierto si usted tiene Python 3.0.
    • He actualizado la respuesta a usar el argumento de posición y de incluir el «modulo-formato de» pre-2.6 intérpretes.
    • Mientras que esta respuesta es técnicamente cierto e informativo, me hacen sentir que le falta el punto de la cuestión. Si usted print '{0:.15f}'.format(600.2) te darás cuenta de que ya no cero números arrastrándose desde la derecha, y cuanto más grande sea el número, más «ruido» que se ven en los decimales. Ver mi respuesta sobre el uso de la decimal módulo si usted realmente se preocupa por el mantenimiento de 15 dígitos de precisión.
    • Puedo obtener errores de Sintaxis en Python 3.7 debido a la falta de soportes. He agregado en

  2. 4

    Supongo que esto es esencialmente poner en una cadena, pero esto evita el error de redondeo:

    import decimal
    
    def display(x):
        digits = 15
        temp = str(decimal.Decimal(str(x) + '0' * digits))
        return temp[:temp.find('.') + digits + 1]

Dejar respuesta

Please enter your comment!
Please enter your name here