Pregunta ¿Cómo puedo forzar a la división a ser punto flotante? La división sigue redondeando a 0


Tengo dos valores enteros a y b, pero necesito su proporción en coma flotante. Yo sé eso 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 ser un número de coma flotante en Python en lo siguiente?

c = a / b

614
2017-08-12 18:25


origen


Respuestas:


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

708
2017-08-12 18:28



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


Una advertencia: como comentaron los comentaristas, esto no funcionará si b podría ser algo más que un número entero o un número de punto flotante (o una cadena que representa uno). Si puede tratar con otros tipos (como números complejos) deberá verificarlos o utilizar un método diferente.


666
2017-08-12 18:28



c = a / (b * 1.0)

125
2017-08-12 18:26



¿Cómo puedo forzar a la división a ser punto flotante en Python?

Tengo dos valores enteros a y b, pero necesito su relación en coma flotante. Sé que 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 que c sea un número de coma flotante en Python a continuación?

c = a / b

Lo que realmente se pregunta aquí es:

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

Actualiza a Python 3

En Python 3, para obtener la verdadera división, simplemente haces a / b.

>>> 1/2
0.5

La división de piso, el clásico comportamiento de división para enteros, ahora es a // b:

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

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 sólidas 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:

from __future__ import division

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:

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

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. El más popular es forzar uno de los operandos para que flote. Una solución robusta es a / (b * 1.0). En un nuevo shell de Python:

>>> 1/(2 * 1.0)
0.5

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

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

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í no tener fallas de división cuando 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í hacer que tu código sea más frágil.

También puede ejecutar Python con el -Qnew marcar, pero esto tiene el inconveniente 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 lo recomiendo, excepto para las pruebas. Pero para demostrar:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

104
2017-09-18 17:29



En Python 3.x, la barra única (/) siempre significa división verdadera (no truncada). (Los // el operador se usa para truncar la división.) En Python 2.x (2.2 y superior), puede obtener este mismo comportamiento poniendo un

from __future__ import division

en la parte superior de tu módulo


63
2017-08-12 18:30



Simplemente hacer cualquiera de los parámetros para la división en formato de coma flotante también produce la salida en 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

29
2017-09-24 06:22



Agrega un punto (.) para indicar números de coma flotante

>>> 4/3.
1.3333333333333333

o

>>> from __future__ import division
>>> 4/3
1.3333333333333333

19
2017-11-22 14:39



Esto también funcionará

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

0.2


12
2017-12-24 19:58



Si desea usar la división "verdadera" (coma flotante) de manera predeterminada, hay un indicador de línea de comando:

python -Q new foo.py

Hay algunos inconvenientes (del PEP):

Se ha argumentado que una opción de línea de comando para cambiar el         el predeterminado es malvado. Sin duda puede ser peligroso en el mal         manos: por ejemplo, sería imposible combinar una tercera         paquete de biblioteca de fiesta que requiere -Que con otro que         requiere -Qold.

Puede obtener más información acerca de los otros valores de indicadores que cambian / advierten sobre el comportamiento de la división consultando la página man de python.

Para detalles completos sobre cambios de división, lea: PEP 238 - Cambio del operador de la división


6
2018-01-07 18:33