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


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 entera 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
Author: Shaido, 2009-08-12

13 answers

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
 719
Author: Michael Fairley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-12 18:28:26

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


Una advertencia: como los comentaristas han señalado, esto no funcionará si b podría ser algo que no sea un número entero o de coma flotante (o una cadena que represente uno). Si usted podría estar tratando con otros tipos (como números complejos) tendrá que comprobar si hay o utilizar un método diferente.

 672
Author: Steve Trout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-13 22:05:42
c = a / (b * 1.0)
 127
Author: Pinochle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-12 18:26:57

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

Tengo dos valores enteros a y b, pero necesito su relación en coma flotante. Sé que a

¿Cómo puedo forzar a c a ser un número de coma flotante en Python en lo siguiente?

c = a / b

Lo que realmente se está preguntando aquí es:

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

Actualizar a Python 3

En Python 3, para obtener una verdadera división, simplemente haga a / b.

>>> 1/2
0.5

La división de piso, el comportamiento de división clásico para enteros, es ahora 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 Se 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 robusto que otros.

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 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 de Python 2

Si no desea aplicar esto a todo el módulo, está limitado a algunas soluciones alternativas. El más popular es coaccionar uno de los operandos a un flotador. Una solución robusta es a / (b * 1.0). En una nueva shell Python:

>>> 1/(2 * 1.0)
0.5

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

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

No recomendado para Python 2

Comúnmente visto es a / float(b). Esto levantará un TypeError si b es un número complejo. Dado que la división con números complejos está definida, tiene sentido para mí no tener división falla 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í hacer a propósito su código más frágil.

También puede ejecutar Python con la bandera -Qnew, 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 división clásica, por lo que no recomiendo esto excepto para probar. Pero para demostrar:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
 121
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-29 15:45:52

En Python 3.x, la barra simple (/) siempre significa división verdadera (no truncante). (El operador // se utiliza 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 su módulo.

 63
Author: newacct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-12 18:30:30

Simplemente haciendo cualquiera de los parámetros para la división en formato de punto flotante también produce la salida en punto 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
Author: gsbabil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 21:17:33

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

>>> 4/3.
1.3333333333333333

O

>>> from __future__ import division
>>> 4/3
1.3333333333333333
 20
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-22 14:39:24

Esto también funcionará

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

0.2

 12
Author: Gaurav Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-24 19:58:41

Si desea usar la división" true " (coma flotante) de forma predeterminada, hay un indicador de línea de comandos:

python -Q new foo.py

Hay algunos inconvenientes (del PEP):

Se ha argumentado que una opción de línea de comandos para cambiar el defecto es malo. Sin duda puede ser peligroso en el mal manos: por ejemplo, sería imposible combinar un 3er paquete de biblioteca de fiestas que requiere-Qnew con otro que requiere -Qold.

Puedes obtenga más información sobre los otros valores de flags que cambian / advierten - sobre el comportamiento de la división mirando la página man de python.

Para más detalles sobre los cambios de división, léase: PEP 238 Changing Cambiar el Operador de División

 6
Author: stephenbez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-07 18:33:47

Si haces una división de dos enteros python te devolverá un entero, entonces necesitas hacer:

c = float(a)/b

O

c = a/float(b)

Y luego obtener c como un float tipo

 5
Author: Juan Camilo Torres Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 07:34:27
from operator import truediv

c = truediv(a, b)
 3
Author: JoeCondron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 14:18:21
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 enteros es un flotador.

 1
Author: Chetan Yeshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 09:20:26

Esto también funcionará

U = 1./5 print u

0.2

Respondió Diciembre 24 ' 13 en 19: 58 Gaurav Agarwal 6,7172279140

Gracias Gauraw, esto hace el truco y es una solución bastante ordenada. En caso de que tanto el numerador como el denominador sean variables, la "solución" podría estar multiplicando 1. por el cociente.

Ejemplo:

aa = 2
bb = 3

aa / bb = 0

1. * aa / bb = 0.6666666666666666

;-)

Max-Italia

 1
Author: Max1234-ITA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-15 07:28:36