HOWTO · Python
Truncar Float en Python
Este tutorial explica cómo truncar un float en Python
En esta página
Un float de Python no se puede acortar directamente: es un valor de punto flotante binario, no una cadena decimal con una cantidad fija de dígitos. Para descartar los dígitos posteriores a una posición decimal determinada, crea un Decimal a partir del texto decimal del número y cuantízalo con ROUND_DOWN. Si necesitas un resultado entero, usa math.trunc() o int(). Estas operaciones truncan hacia cero; round() y el formato numérico se comportan de otra manera.
Elegir entre truncar y redondear
Truncar descarta los dígitos posteriores a una posición determinada y acerca el valor a cero. Redondear elige un valor cercano según una regla de redondeo. La función round(number, ndigits) de Python redondea; no trunca. Por ejemplo, round(3.146, 2) redondea a 3.15, mientras que truncar a dos decimales da 3.14. La función integrada round() de Python usa el redondeo al par en los casos de empate, así que no debe considerarse un método general para truncar decimales.
Truncar un float a una cantidad fija de decimales
Usa Decimal cuando necesites conservar una cantidad determinada de decimales. Créalo a partir de una representación de cadena y luego llama a quantize() con ROUND_DOWN. En el módulo decimal, ROUND_DOWN redondea hacia cero: descarta dígitos en esa dirección, por lo que los valores negativos se acercan a cero en lugar de alejarse hacia valores más negativos. Pasar una cadena como "3.14159" conserva el valor decimal previsto; en cambio, crear Decimal directamente a partir de un float captura su aproximación binaria.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from decimal import Decimal, ROUND_DOWN
values = ("3.14159", "-3.14159", "0", "2.1")
places = 2
quantum = Decimal("1").scaleb(-places)
for text in values:
print(Decimal(text).quantize(quantum, rounding=ROUND_DOWN))
3.14
-3.14
0.00
2.10
Los dos primeros resultados muestran el truncamiento hacia cero para ambos signos, incluido el valor negativo. La cuantización también conserva la cantidad solicitada de posiciones decimales: el cero se convierte en 0.00 y 2.1 en 2.10. Si ya tienes un float y quieres usar como entrada su representación decimal más corta, usa Decimal(str(value)); esto no puede recuperar la información decimal que se perdió antes de crear el float. Para cantidades monetarias u otros valores decimales exactos, es preferible aceptar texto decimal o crear Decimal a partir de enteros y cadenas desde el principio. Consulta la documentación del módulo decimal.
Truncar hacia cero a un entero
Si necesitas un entero en lugar de una cantidad fija de decimales, math.trunc() devuelve explícitamente la parte entera hacia cero. La función integrada int() hace lo mismo al convertir un float. Por ejemplo, math.trunc(5.67) da 5 y math.trunc(-3.45) da -3. Ninguna de estas opciones conserva decimales; usa Decimal.quantize() si el resultado necesita una escala decimal fija. math.trunc() también acepta tipos numéricos que implementen __trunc__(), que proporciona el valor entero usado para truncar.
Por qué escalar un float puede dar resultados inesperados
Un atajo habitual consiste en multiplicar un float por una potencia de diez, convertir el resultado en entero y volver a dividirlo. Puede funcionar con algunos valores, pero los floats binarios no pueden representar exactamente muchas fracciones decimales. Por eso, la multiplicación puede quedar justo por debajo o por encima del valor decimal previsto, y int(value * 100) / 100 puede descartar un dígito inesperado. Además, devuelve otro float, que sigue sujeto a las limitaciones de la representación binaria. No dependas de este patrón para operaciones sensibles a los decimales; usa Decimal con texto como entrada. En cálculos cuyo dominio sea inherentemente aproximado, conserva los valores como floats y ten en cuenta su precisión en vez de tratar los dígitos mostrados como exactos.
Elegir el método adecuado
- Usa
Decimal, creado a partir de texto decimal, yquantize(..., rounding=ROUND_DOWN)para truncar a una cantidad fija de decimales. - Usa
math.trunc()oint()para descartar la parte fraccionaria y obtener un entero hacia cero. - Usa
round()cuando quieras redondear, no truncar. - Usa el formato si solo necesitas controlar el texto mostrado. Una f-string como
f"{value:.2f}"produce una cadena y redondea el valor que muestra; no modifica ni trunca el float subyacente.
Elige según el resultado que necesites: un valor decimal con una precisión determinada, un entero, un valor redondeado o solo una cadena con formato.