Estoy tratando de truncar un valor decimal en Python. No quiero la vuelta, pero en lugar de mostrar sólo los valores decimales hasta la precisión especificada. He intentado lo siguiente:

d = 0.989434
'{:.{prec}f}'.format(d, prec=2)

Esto se redondea a 0.99. Pero quiero que la salida de 0,98. Obviamente, round() no es una opción. Hay alguna forma de hacer esto? O debo volver al código y cambiar todo para decimal?

Gracias.

Hmmm, no estoy seguro si hay una forma de hacerlo con el formato de cadena. Voy a hacer un poco de investigación 🙂
Más respuestas por favor. Definitivamente, necesitamos más.
Este no es un decimal.Decimal, pero un float

OriginalEl autor visakh | 2013-12-12

12 Comentarios

  1. 7

    Yo no soy consciente de que todas sus necesidades, pero esto va a ser bastante robusto.

    >> before_dec, after_dec = str(d).split('.')
    >> float('.'.join((before_dec, after_dec[0:2])))
    0.98

    2018-01-03 editar

    Esta respuesta no es robusta o matemáticamente correcta. Ver Nilani Algiriyage la respuesta de abajo para la manera correcta de hacer esto utilizando Decimal.quantize método.

    after_dec[:2] es suficiente 🙂
    Seguro que es, pero creo que la convención tiene más sentido en el caso de que el otro lado es desconocido, es decir, a_list[3:] así que realmente no presto mucha atención a los [0:2] vs [:2], lo que sale en el momento en que es lo suficientemente bueno 🙂
    ¿Por qué aceptar esto como la solución? 🙂 Me gustaría encontrar a alguna de las matemáticas basado en soluciones ligeramente más robusto!
    Solo por curiosidad, es todo 🙂 me gustaría utilizar el Decimal o cualquier otra de las matemáticas basado en soluciones personalmente! se me olvidó que en punto flotante el formato de cadena de especificadores de hacer de redondeo! :/
    si tuviera que adivinar: que, probablemente, sólo quería hacer esto en sólo un número, y tan pronto como llegó a una solución de trabajo de la aceptó, sin tomarse la molestia de leer el de los demás…

    OriginalEl autor Derek Litz

  2. 9

    Puede utilizar el siguiente código

    import decimal
    d = 0.989434
    
    print decimal.Decimal(d).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)

    OriginalEl autor Nilani Algiriyage

  3. 4
    d = 0.989434
    print floor(d * 100) / 100

    De matemáticas.piso(x) Devolver el piso de x como un flotador, el entero más grande
    valor menor o igual a x.

    Mover el 2 decimales a la izquierda de la coma decimal ‘.’, piso, luego de mudarse de vuelta a los números de la derecha de la ‘.’

    100 se puede modificar por

    n = 2
    m = pow (10, n)
    d = 0.989434
    print floor(d * m) / m

    n es el deseado de precisión.

    EDICIÓN:
    En el caso de que d es negativo, usted tiene que utilizar el ceil método

    if d < 0:
        print ceil(d * m) / m
    else:
        print floor(d * m) / m
    Tenga en cuenta que para d = -0.989434 esto imprime -0.99
    Gracias por darse cuenta de que, he editado mi respuesta

    OriginalEl autor Marcassin

  4. 3

    Formato a algo mucho más tiempo y, a continuación, cortar los dígitos adicionales:

    def truncate(f, digits):
        return ("{:.30f}".format(f))[:-30+digits]
    Es ineficaz, pero la única respuesta aquí que parece que no han roto el borde de los casos.

    OriginalEl autor RemcoGerlich

  5. 3

    Esta es la mejor manera que yo creo.

    1. Mueva los dígitos significativos a la izquierda
    2. Truncar la parte decimal
    3. Mover el número de dígitos que se mueve a la izquierda, a la derecha

      d = 0.989434
      print "{0:0.2f}".format(int(d * 100)/100.0)

      Salida

      0.98

    OriginalEl autor thefourtheye

  6. 2
    import math
    
    d = 0.989434
    prec = 2
    output = math.floor(d * (10 ** prec)) / (10 ** prec)

    Si usted todavía desea una variable decimal en lugar de cadena

    Tenga en cuenta que para d = -0.989434 esto imprime -0.99
    Sí, tiene usted razón! Que viene de la definición de floor. Parece que es mejor utilizar el formato de cadena. 🙂

    OriginalEl autor Ray

  7. 2

    Bastante similar a la de algunas otras respuestas, pero sin ninguna de las importaciones

    def truncate(x, d):
        return int(x*(10.0**d))/(10.0**d)
    
    >>>truncate(0.987654, 2)
    0.98
    Bastante seguro de int(x*(10.0**d))/(10.0**d) funcionaría igual de bien aquí
    Tienes toda la razón! No sé por qué yo no vea que 😛 Con su permiso me voy a cambiar o agregar a la respuesta…
    Yo no voy a dejar que cambiar!

    OriginalEl autor Kraay89

  8. 1

    con str:

    d = str(0.989434)
    print float(d[:d.find('.')+3])

    OriginalEl autor onionpsy

  9. 1

    Si sólo se necesita mostrar la puede convertir a string y córtalo :

    d = 0.989434
    print str(d)[0:4] #or print(str(d)[0:4])

    OriginalEl autor feydaykyn

  10. 1

    El código siguiente impresión de 0,98 en este caso, aunque usted tendrá que tener cuidado de que su valor de d no ser mayor que o igual a 10, como se va a imprimir, por ejemplo, 10.1, en lugar de 10.12.

    d = 0.989434
    print '{:.{prec}s}'.format(str(d), prec=4)
    Yo me da un error…el formato Desconocido el código «f», para el objeto de tipo ‘str’
    Lo siento, sí, me olvidé de cambiar la f a s en la cadena de formato. Ha editado ahora.

    OriginalEl autor Ffisegydd

  11. 1

    También con las matemáticas:

    d = 0.989434
    x = int(d * 100.0) / 100.0
    print "{0:0.2f}".format(x)
    Sí…quiero evitar el redondeo…

    OriginalEl autor James Mills

  12. 0

    En este enlace aquí he publicado la solución a continuación:

    def truncate_number(f_number, n_decimals):
          strFormNum = "{0:." + str(n_decimals+5) + "f}"
          trunc_num = float(strFormNum.format(f_number)[:-5])
          return(trunc_num)
    
    # Testing the 'trunc_num()' function
    test_num = 1150/252
    [(idx, truncate_number(test_num, idx)) for idx in range(0, 20)]

    A leat no es necesario cargar ningún módulo ni las demandas de nuevos cálculos. Hasta ahora, solucionó mi problema con el truncamiento de los requisitos en público los precios de los bonos cálculos.

    OriginalEl autor Eduardo Alvim

Dejar respuesta

Please enter your comment!
Please enter your name here