2012-02-17 21 views
6

He estado experimentando con las habilidades matemáticas de Python y encontré un comportamiento interesante. Está relacionado con la siguiente expresión:¿Por qué Python evalúa esta expresión incorrectamente?

(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 

>>> 415 

Sin embargo, si se evalúa la expresión con el orden natural de las operaciones en mente, la respuesta debe ser 420.25. También he comprobado dos veces con WolframAlpha, que da una respuesta de 420.25. ¿Por qué Python está dando una respuesta diferente? ¿Tiene algo que ver con la forma en que evalúa tales expresiones? ¿Hay alguna convención que sea la siguiente? Cualquier información sería muy apreciada, ¡gracias!

+0

Supongo que si encuentra '3/4/5 * 35' ambiguo y lo evalúa de manera diferente a como lo hace. Es mejor poner algunos paréntesis allí – inspectorG4dget

+0

las reglas de precedencia de un lenguaje de programación pueden no serlo y en este caso no son exactamente iguales a las matemáticas regulares. también en matemáticas regulares esa expresión evalúa a aproximadamente 415.00428571428574 – ChessMaster

+0

¿Intentó hacer ejemplos más simples? –

Respuesta

10

Quiere usar la división de punto flotante. Si lo cambia a esto funciona:

(4+4)+3.0/4/5*35-(3*(5+7))-6+434+5+5+5 

Algunos ejemplos de división entera vs. división de coma flotante:

Python 2.7.2+ (default, Oct 4 2011, 20:06:09) 
>>> 3/4 
0 
>>> 3.0/4 
0.75 
>>> 3.0/4.0 
0.75 

Un flotador dividida por un entero es una operación de punto flotante. Python 3 ha cambiado esto para que la división de coma flotante es el valor por defecto:

Python 3.2.2 (default, Sep 5 2011, 21:17:14) 
>>> 3/4 
0.75 
4

En Python 2.x el operador/es una división entera. Si escribe

(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5 

dará la respuesta esperada.

4

que depende de la versión de Python que esté ejecutando:

$ python3 
Python 3.1.4 (default, Nov 12 2011, 12:16:31) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 

Antes de Python 3, el operador realiza / número entero división en lugar de coma flotante.

7

Porque, en Python 2, / usa la división de enteros cuando el operador y el operando son enteros.

Usted puede cambiar uno a un flotador (como otros han sugerido que responden), o utilizar from __future__ import division: http://www.python.org/dev/peps/pep-0238/

3

Es la división entera. En su ejemplo, 3/4 se evalúa a 0. Sin embargo, 3.0/4.0 se evalúa a 0.75.

>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
415 
>>> (4+4)+3./4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 

Este comportamiento se modificó en Python versiones 3 y posteriores. Si desea que se convierta por defecto en una división de punto flotante, puede importar la regla.

>>> from __future__ import division 
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 
1

es importante notar que ni el pitón o WolframAlpha no le dará la respuesta correcta matemáticamente ya que en matemáticas vamos a hacer la multiplicación antes de la división y en Python * y/tienen la misma precedencia por lo evaluará izquierda a derecha.

3.0/4/5*35 # equal 5.25 in python 
3.0/4/5*35 # equal 3.0/4/(5*35) or 0.004285714285714286 in math 
Cuestiones relacionadas