Tengo dos valores enteros a
y b
, pero necesito su relación en coma flotante. Lo sé a < b
y quiero calcular a / b
, así que si uso la división de enteros siempre obtendré 0 con un resto de a
.
¿Cómo puedo forzar c
a ser un número de coma flotante en Python en lo siguiente?
c = a / b
python
floating-point
integer
division
python-2.x
Nathan Fellman
fuente
fuente
Respuestas:
En Python 2, la división de dos entradas produce un int. En Python 3, produce un flotador. Podemos obtener el nuevo comportamiento importando desde
__future__
.fuente
from __future__ import division
debe estar al comienzo del archivo//
cuando se desea la división de piso y/
cuando se desea lafloat
división "verdadera" ( ).Puedes lanzar para flotar haciendo
c = a / float(b)
. Si el numerador o denominador es flotante, el resultado también lo será.Una advertencia: como han señalado los comentaristas, esto no funcionará si
b
podría ser algo más que un número entero o de coma flotante (o una cadena que representa uno). Si puede estar tratando con otros tipos (como números complejos), deberá verificarlos o utilizar un método diferente.fuente
Lo que realmente se pregunta aquí es:
"¿Cómo forzo una verdadera división tal que
a / b
devuelva una fracción?"Actualiza a Python 3
En Python 3, para obtener una verdadera división, simplemente hazlo
a / b
.La división de piso, el comportamiento clásico de división para enteros, ahora es
a // b
:Sin embargo, puede estar atascado usando Python 2, o puede estar escribiendo código que debe funcionar tanto en 2 como en 3.
Si usa Python 2
En Python 2, no es tan simple. Algunas formas de lidiar con la división clásica de Python 2 son mejores y más robustas que otras.
Recomendación para Python 2
Puede obtener el comportamiento de división de Python 3 en cualquier módulo dado con la siguiente importación en la parte superior:
que luego aplica la división de estilo Python 3 a todo el módulo. También funciona en un shell de python en cualquier punto dado. En Python 2:
Esta es realmente la mejor solución, ya que garantiza que el código en su módulo sea más compatible con Python 3.
Otras opciones para Python 2
Si no desea aplicar esto a todo el módulo, está limitado a algunas soluciones alternativas. Lo más popular es obligar a uno de los operandos a flotar. Una solución robusta es
a / (b * 1.0)
. En una nueva carcasa de Python:También es robusto
truediv
deloperator
módulooperator.truediv(a, b)
, pero es probable que sea más lento porque es una llamada de función:No recomendado para Python 2
Comúnmente visto es
a / float(b)
. Esto generará un TypeError si b es un número complejo. Como la división con números complejos está definida, tiene sentido para mí que no falle la división cuando se pasa un número complejo para el divisor.No tiene mucho sentido para mí hacer que su código sea más frágil a propósito.
También puede ejecutar Python con el
-Qnew
indicador, pero esto tiene la desventaja de ejecutar todos los módulos con el nuevo comportamiento de Python 3, y algunos de sus módulos pueden esperar una división clásica, por lo que no recomiendo esto, excepto para las pruebas. Pero para demostrar:fuente
fuente
En Python 3.x, la barra simple (
/
) siempre significa división verdadera (no truncada). (El//
operador se usa para truncar la división). En Python 2.x (2.2 y superior), puede obtener este mismo comportamiento colocando unen la parte superior de tu módulo.
fuente
Simplemente hacer que cualquiera de los parámetros para la división en formato de punto flotante también produzca la salida en punto flotante.
Ejemplo:
o,
o,
o,
fuente
1.0 + 1/3
ofloat(c) + a/b
ofloat(a/b)
y se sentirá decepcionado con la respuesta. Es mejor usar python 3+ o importar el__future__.division
módulo (vea la respuesta aceptada) para obtener siempre la respuesta que espera. Las reglas de división existentes crean un error matemático insidioso y difícil de rastrear.python -c 'a=10; b=3.0; print a/b'
?a
y 'b', por ejemplo, son las salidas de una función de valor entero? Eja = len(list1), b = len(list2)
.float(..)
. Creo que multiplicar por1.0
, como @Pinochle sugirió a continuación, también podría ser útil.Agregue un punto (
.
) para indicar números de coma flotantefuente
float()
una de las variables.Esto también funcionará
fuente
a
yb
../
era un operador válido en Python que le permite hacer la división de coma flotante. Es por eso que es bueno usar el espacio en blanco con prudencia, en cualquier lenguaje de programaciónSi desea utilizar la división "verdadero" (punto flotante) de forma predeterminada, hay un indicador de línea de comando:
Hay algunos inconvenientes (del PEP):
Puede obtener más información sobre los otros valores de las banderas que cambian / advierten sobre el comportamiento de la división mirando la página del manual de Python.
Para más detalles sobre los cambios de división, lea: PEP 238 - Cambio del operador de división
fuente
fuente
a
sea un int yb
sea un flotador. Una mejor solución en la misma línea es hacerfrom operator import truediv
y luego usartruediv(a, b)
.donde a es dividendo y b es el divisor. Esta función es útil cuando el cociente después de la división de dos enteros es flotante.
fuente