¿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
13 answers
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
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.
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)
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
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.
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
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
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
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
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
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)
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.
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
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