¿Cómo puedo forzar la división para que sea punto flotante? ¿La división sigue redondeando a 0?

Tengo dos valores enteros a y b , pero necesito su relación en punto flotante. Sé que a < b y quiero calcular a / b , así que si uso la división entera, siempre obtendré 0 con el rest de a .

¿Cómo puedo forzar que c sea ​​un número de punto flotante en Python en lo siguiente?

 c = a / b 

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

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


Una advertencia: como han señalado los comentaristas, esto no funcionará si b podría ser algo más que un número entero o de coma flotante (o una cadena que representa uno). Si es posible que estés tratando con otros tipos (como números complejos) necesitarás verificarlos o usar un método diferente.

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

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

¿Cómo puedo forzar que c sea un número de punto flotante en Python en lo siguiente?

 c = a / b 

Lo que realmente se pregunta aquí es:

“¿Cómo fuerzo la división verdadera de modo que a / b devuelva una fracción?”

Actualizar a Python 3

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

 >>> 1/2 0.5 

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

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

Sin embargo, puede quedar atrapado usando Python 2, o puede estar escribiendo un 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 tratar con la división clásica de Python 2 son mejores y más robustas 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 una 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 de 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 alternativas. Lo más popular es coaccionar uno de los operandos a un flotador. Una solución robusta es a / (b * 1.0) . En una shell de Python fresca:

 >>> 1/(2 * 1.0) 0.5 

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

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

No recomendado para Python 2

Comúnmente se ve a / float(b) . Esto elevará 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 fallar la división cuando se pasa un número complejo para el divisor.

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

No tiene mucho sentido para mi propósito hacer que su código sea más frágil.

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

 $ 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 única ( / ) siempre significa una división verdadera (no truncadora). (El operador // se usa para truncar la división). En Python 2.x (2.2 y superior), puede obtener este mismo comportamiento al poner un

 from __future__ import division 

en la parte superior de tu módulo.

El solo hecho de hacer 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 

Agregue un punto ( . ) Para indicar números de punto flotante

 >>> 4/3. 1.3333333333333333 

o

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

Esto también funcionará

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

0.2

Si desea usar la división “verdadera” (punto flotante) de forma predeterminada, hay un indicador de línea de comando:

 python -Q new foo.py 

Hay algunos inconvenientes (de la PEP):

Se ha argumentado que una opción de línea de comando para cambiar el valor predeterminado es mala. Ciertamente, puede ser peligroso en las manos equivocadas: por ejemplo, sería imposible combinar un paquete de biblioteca de terceros que requiera -Que sea nuevo con otro que requiera -Qold.

Puede aprender más sobre los valores de otras banderas que cambian / advierten sobre el comportamiento de la división mirando la página de manual de python.

Para detalles completos sobre los cambios de división, lea: PEP 238 – Cambiando el Operador de División

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

 c = float(a)/b 

o

 c = a/float(b) 

y luego obtener c como un tipo de float

 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 enteros es un flotante.

Esto también funcionará

u = 1. / 5 imprime u

 0.2 

respondió el 24 de diciembre de 2013 a las 19:58 Gaurav Agarwal 6,7172279140

Gracias Gauraw, esto hace el truco y es una solución bastante buena. 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