¿Cómo puedo forzar la división estar en coma flotante? División mantiene redondeo a 0?
-
13-09-2019 - |
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
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.