2009-11-24 19 views
8

considerar:¿Por qué esta división no funciona en Python?

>>> numerator = 29 
>>> denom = 1009 
>>> print str(float(numerator/denom)) 
0.0 

¿Cómo puedo hacer que vuelva decimal?

+1

Un poco al margen, pero 'float' no es lo mismo que el tipo' Decimal' en la biblioteca estándar de Python. Cuando dices "solo quiero que devuelva un decimal", lo que realmente quieres decir es "solo quiero que devuelva una cadena que represente un valor fraccionario en notación decimal", ¿verdad? –

Respuesta

24

Hasta la versión 3, el operador de división de Python, /, se comportó como el operador de división de C cuando se le presentan dos argumentos enteros: devuelve un resultado entero que se trunca cuando hay una parte fraccionaria. Ver: PEP 238

>>> n = 29 
>>> d = 1009 
>>> print str(float(n)/d) 
0.0287413280476 

En Python 2 (y tal vez antes) podría usar:

>>> from __future__ import division 
>>> n/d 
0.028741328047571853 
+0

-7 // 3 = -3 (resto = 2) en Python y -7/3 = -2 (resto = -1) en C/C++, así que no diría que este comportamiento es el mismo en Python que en C/C++ – Artur

7

En Python 2.x, la división funciona como lo hace en lenguajes de programación como C: si ambos los argumentos son enteros, el resultado se trunca en un entero, entonces 29/1009 es 0. 0 ya que un flotante es 0.0. Para solucionarlo, echados a un flotador antes de dividir:

print str(float(numerator)/denominator) 

En Python 3.x, la división actúa de forma más natural, de manera que obtendrá el resultado matemático correcto (dentro del error de punto flotante).

0
print str(float(numerator)/float(denom)) 
+0

Es suficiente para convertir cualquiera de los operandos en float(). Generalmente recomiendo lanzar el numerador ya que localiza el modelo al principio de la expresión, donde los lectores normalmente lo verán más fácilmente. –

+0

Sí, lo es, pero me pareció más "apropiado" solo porque era más transparente en su fundición. Pero sí, lanzar uno solo es suficiente. – inspectorG4dget

1

En su evaluación está emitiendo el resultado, en lugar de eso, debe emitir los operandos.

Cuestiones relacionadas