Sé que las preguntas sobre el redondeo en Python ya se han hecho varias veces, pero las respuestas no me ayudaron. Estoy buscando un método que redondea un número flotante a la mitad y devuelve un número flotante. El método también debe aceptar un parámetro que defina el lugar decimal a redondear. Escribí un método que implementa este tipo de redondeo. Sin embargo, creo que no se ve elegante en absoluto.
def round_half_up(number, dec_places):
s = str(number)
d = decimal.Decimal(s).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
No me gusta, que tengo que convertir flotante a una cadena (para evitar imprecisiones de coma flotante) y luego trabajar con el módulo decimal . ¿Tienes alguna solución mejor?
Editar: como se señala en las respuestas a continuación, la solución a mi problema no es tan obvia ya que el redondeo correcto requiere la representación correcta de los números en primer lugar y este no es el caso con el flotador. Así que esperaría que el siguiente código
def round_half_up(number, dec_places):
d = decimal.Decimal(number).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
(que difiere del código anterior solo por el hecho de que el número flotante se convierte directamente en un número decimal y no en una cadena primero) para devolver 2.18 cuando se usa de esta manera: round_half_up(2.175, 2)
Pero no lo hace porque Decimal(2.175)
regresará Decimal('2.17499999999999982236431605997495353221893310546875')
, de la forma en que flota El número está representado por la computadora. Sorprendentemente, el primer código devuelve 2,18 porque el número flotante se convierte primero en una cadena. Parece que la función str () realiza un redondeo implícito al número que inicialmente debía redondearse. Entonces hay dos redondeos que tienen lugar. Aunque este es el resultado que esperaría, es técnicamente incorrecto.