Pregunta

Tengo dos valores enteros a y b, pero necesito su proporción en punto flotante. Sé que a < b y quiero calcular a / b, por lo que si uso división entera que siempre obtendrá 0 con un resto de a.

¿Cómo puedo forzar c ser un número de punto flotante en Python en el siguiente?

c = a / b
¿Fue útil?

Solución

En Python 2, división de dos enteros produce un int. En Python 3, produce un flotador. Podemos obtener el nuevo comportamiento mediante la importación de __future__.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

Otros consejos

Puede echar a flotar haciendo c = a / float(b). Si el numerador o el denominador es un flotador, entonces el resultado será también.


Una advertencia: como comentaristas han señalado, esto no va a funcionar si b podría ser algo que no sea un número entero o de coma flotante (o una cadena que representa uno). Si es posible que se trata de otro tipo (como los números complejos) tendrá que comprobar ya sea para aquellos o utilizar un método diferente.

  

¿Cómo puedo forzar la división estar en coma flotante en Python?

     

Tengo dos valores enteros A y B, pero necesito su proporción en punto flotante. Yo sé que a      

¿Cómo puedo forzar c ser un número de punto flotante en Python en el siguiente?

c = a / b

Lo que se pide realmente aquí es:

"¿Cómo fuerzo verdadera división de tal manera que a / b volverá una fracción?"

Actualizar a Python 3

En Python 3, para obtener la verdadera división, sólo tiene que hacer a / b.

>>> 1/2
0.5

división de suelo, el comportamiento clásico de la división de números enteros, que ahora se a // b:

>>> 1//2
0
>>> 1//2.0
0.0

Sin embargo, puede ser atrapado usando Python 2, o puede estar escribiendo código que debe trabajar tanto en 2 y 3.

Si utilizar Python 2

En Python 2, no es tan simple. Algunas maneras de hacer frente a la división clásica de Python 2 son mejores y más robustos que otros.

Recomendación para Python 2

Puede obtener Python 3 comportamiento de la división de cualquier módulo dado con la siguiente importación en la parte superior:

from __future__ import division

que luego se aplica la división de estilo Python 3 a todo el módulo. También funciona en una cáscara de pitón en cualquier punto dado. En Python 2:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

Esto es realmente la mejor solución, ya que garantiza el código en el módulo es más compatible con versiones futuras Python 3.

Otras opciones para Python 2

Si no desea aplicar esto a todo el módulo, que está limitada a algunas soluciones. El más popular es para obligar a uno de los operandos a un flotador. Una solución robusta es a / (b * 1.0). En una cáscara de Python fresco:

>>> 1/(2 * 1.0)
0.5

También es robusto truediv del módulo operator operator.truediv(a, b), pero esto es probablemente más lenta porque es una llamada a la función:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

No se recomienda para Python 2

comúnmente visto es a / float(b). Esto elevará un TypeError si b es un número complejo. Dado que se define la división con números complejos, que tiene sentido para mí no tiene división fallan cuando se pasa un número complejo para el divisor.

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

No tiene mucho sentido para mí para hacer a propósito el código sea más frágil.

También puede ejecutar Python con la bandera -Qnew, pero esto tiene la desventaja de la ejecución de todos los módulos con el nuevo comportamiento Python 3, y algunos de sus módulos puede esperar clásica división, por lo que no se recomienda esta excepción de la prueba. Sin embargo, para demostrar lo siguiente:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
c = a / (b * 1.0)

En Python 3.x, la barra sola (/) siempre significa verdadera división (no truncar). (El operador // se utiliza para truncar división.) En Python 2.x (2.2 y superior), se puede conseguir este mismo comportamiento poniendo un

from __future__ import division

en la parte superior de su módulo.

Simplemente haciendo cualquiera de los parámetros para la división en formato de coma flotante también se produce en la salida de coma flotante.

Ejemplo:

>>> 4.0/3
1.3333333333333333

o

>>> 4 / 3.0
1.3333333333333333

o

>>> 4 / float(3)
1.3333333333333333

o

>>> float(4) / 3
1.3333333333333333

Añadir un punto (.) para indicar los números de coma flotante

>>> 4/3.
1.3333333333333333

Esto también funciona

>>> u=1./5
>>> print u
0.2

Si desea utilizar "verdadero" (coma flotante) división por defecto, no es una marca de línea de comandos:

python -Q new foo.py

Hay algunos inconvenientes (de la PEP):

  

Se ha argumentado que una opción de línea de comandos para cambiar el         por defecto es el mal. Ciertamente, puede ser peligroso en el mal         manos: por ejemplo, que serían imposibles de combinar un tercio         paquete de biblioteca partido que requiere -Qnew con otro que         requiere -Qold.

Usted puede aprender más acerca de los otros valores que cambian banderas / warn-sobre el comportamiento de la división mirando a la página del manual de pitón.

Para más detalles sobre los cambios de división lea: PEP 238 - Cambio del operador de división

from operator import truediv

c = truediv(a, b)
from operator import truediv

c = truediv(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 números enteros es un flotador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top