Como sugiere el título, quiero tomar un número de coma flotante y redondearlo al entero más cercano. Sin embargo, si no es un todo, SIEMPRE quiero redondear la variable, independientemente de lo cerca que esté del siguiente entero. ¿Hay alguna forma de hacer esto?
python
floating-point
integer
rounding
Anthony Perez
fuente
fuente
Respuestas:
Sencillo
funcionará tan bien
fuente
int(-23.3) == 23
Uno de estos debería funcionar:
fuente
math.trunc
es un número entero, mientras que la salida demath.floor
es un flotante.type(math.floor(1.51)) -> int
y atype(math.trunc(1.51)) -> int
partir depython 3.6.0
El
//
operador devuelve el piso de la división. Dado que dividir entre 1 no cambia su número, esto es equivalente al piso pero no se necesita importar. Notas:fuente
int(-1.1) == -1
sin-1.1//1 == -2.0
embargodecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(como se documenta, la afirmación 2 no es ciertadecimal
), por lo que confiar en cómo se//
comporta no es completamente estable, incluso hoy.Para obtener el resultado de coma flotante, simplemente use:
Funciona también para números negativos.
fuente
Creo que necesitas una función de piso:
math.floor (x)
fuente
Mucha gente dice usar
int(x)
, y esto funciona bien para la mayoría de los casos, pero hay un pequeño problema. Si el resultado de OP es:se redondeará a
después del 16 9 se redondeará. Esto no es un gran problema si está seguro de que nunca se encontrará con tal cosa. Pero es algo a tener en cuenta.
fuente
1.9999999999999999
a que2.0
en realidad es igual a en la representación interna float64. I. e. ya se redondea tan pronto como se analiza en un flotante, ya que un flotante de 64 bits no puede representar tantos dígitos significativos. Puede verificar eso con la evaluación1.9999999999999999 == 2.0
. Y si sospecha que la operación igual hace un redondeo en los flotadores, puede comparar la representación binaria construct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
, que también es igual.int()
. El valor ya es 2.0 y lo convertirá felizmente en 2.int()
, solo tiene que ver con un uso incorrecto defloat
, como1.9999999999999999
se redondea2.0
en el momento de la compilación (mientrasint()
se llama el tiempo de ejecución). Si usa el tipo de datos correcto para la variable, todo funciona como se esperaba:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
da1
Si no desea importar matemáticas, puede usar:
int(round(x))
Aquí hay una pieza de documentación:
fuente
round
ya fue discutido y rechazado como respuesta cuando se hizo esta pregunta hace un año. OP quieremath.floor
.Si trabaja con numpy, puede usar la siguiente solución que también funciona con números negativos (también funciona en matrices)
Creo que también funcionará si solo usa el
math
módulo en lugar delnumpy
módulo.fuente
No sé si resolvió esto, pero me topé con esta pregunta. Si desea deshacerse de los puntos decimales, puede usar int (x) y eliminará todos los dígitos decimales. No hay necesidad de usar round (x).
fuente
Simplemente haga una ronda (x-0.5), esto siempre devolverá el siguiente valor entero redondeado hacia abajo de su flotador. También puedes redondear fácilmente haciendo do round (x + 0.5)
fuente
Puede ser muy simple, pero ¿no podrías redondearlo y luego menos 1? Por ejemplo:
fuente
integer
.Usé este código donde restas 0.5 del número y cuando lo redondeas, es el número original redondeado hacia abajo.
fuente