2012-02-23 16 views
7

¿Hay alguna manera de ejecutar una función similar a eval que fuerza sus valores a coma flotante? Tengo la esperanza dePython: eval() que fuerza los valores a coma flotante?

eval('1/3') 

y tengo que devolver el valor de punto flotante 0,333333 en lugar del valor entero 0.

+2

En Python ... versión ...? –

+0

abierto a métodos en cualquier versión de python. –

Respuesta

15

Coge la bandera del compilador para __future__.division, pasarlo y su código para compile(), a continuación, ejecutar eval() en el objeto código devuelto.

(nota por mh) Esto tiene la ventaja añadida de no cambiar la operación de división a nivel mundial, que puede tener efectos secundarios inesperados. (nota final)

>>> import __future__ 
>>> eval(compile('1/3', '<string>', 'eval', __future__.division.compiler_flag)) 
0.33333333333333331 
+0

Esto es perfecto, exactamente lo que necesito. Especialmente bueno es que no cambia el entorno global, lo que podría tener efectos secundarios inesperados en otras partes del programa. Actualizaré su ejemplo para mostrar explícitamente la importación y el uso del indicador del compilador. ¡¡Gracias!! –

+0

Oh, eso es lindo, acabo de ver esto. :-) – kindall

+0

¿Puedo restringir los decimales a dos? – Jim

6

Usted pregunta es realmente: ¿cómo puedo obtener Python para hacer división de coma flotante por defecto. La respuesta es:

from __future__ import division 
+0

en realidad no, de ser posible, lo activaría solo para la evaluación de la expresión ingresada. Pero, al no poder hacer eso, funcionará bien. ¡Gracias! –

+0

Los ajustes '__future__' son por módulo, por lo que podría hacerlo en un módulo separado, pero la forma de Ignacio es mejor. – kindall

2

El problema es que no hay valor flotante en la expresión.

probar esto eval('1/3.0')

2

Esto funciona de forma predeterminada en python3

Python 3.2 (r32:88445, Dec 8 2011, 15:26:51) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> eval("1/3") 
0.3333333333333333 

Para python2 se puede pasar -Qnew en la línea de comandos (lo que equivale a from __future__ import division

$ python -Qnew 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> eval("1/3") 
0.3333333333333333 
1

Basado en Lafada de respuesta, si obtiene la cadena de entrada de una variable:

>>> string = '1/3' 
>>> print eval(string+'.0') 
0.333333333333 
+0

Fallaría en expresiones como 'string = (1/3)'. – Dilawar

+0

La expresión 'string = (1/3)' no crea una cadena. Calcula 1/3, produce un resultado entero de 0, luego almacena el resultado en una variable llamada cadena. Entonces eval (string + '. 0') intentará concatenar el entero cero con la cadena ''00''. Funcionará si su entrada es una cadena real que no se ha evaluado con un entero de antemano. – Knowbody

Cuestiones relacionadas