Почему Python неправильно оценивает это выражение? - PullRequest
6 голосов
/ 18 февраля 2012

Я экспериментировал с математическими способностями Python и натолкнулся на интересное поведение. Это связано со следующим выражением:

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

>>> 415

Однако, если вы оцениваете выражение с учетом стандартного порядка операций, ответ должен быть 420.25. Я также дважды проверил с WolframAlpha, который дает ответ 420.25. Почему Python дает другой ответ? Это как-то связано с тем, как он оценивает такие выражения? Есть ли какое-то соглашение, что его следует? Любая информация будет принята с благодарностью, спасибо!

Ответы [ 6 ]

10 голосов
/ 18 февраля 2012

Вы хотите использовать деление с плавающей запятой. Изменение на это работает:

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

Некоторые примеры целочисленного деления и деления с плавающей запятой:

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

Число с плавающей точкой, деленное на целое число, является операцией с плавающей точкой. В Python 3 это изменилось, поэтому по умолчанию используется деление с плавающей точкой:

Python 3.2.2 (default, Sep  5 2011, 21:17:14) 
>>> 3/4
0.75
7 голосов
/ 18 февраля 2012

Потому что в Python 2 / использует целочисленное деление, когда оператор и операнд являются целыми числами.

Вы можете либо заменить один на плавающее (как предлагали другие авторы), либо использовать from __future__ import division: http://www.python.org/dev/peps/pep-0238/

4 голосов
/ 18 февраля 2012

Это зависит от используемой версии Python:

$ 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

До Python 3 оператор / выполнял целочисленное деление вместо числа с плавающей запятой.

4 голосов
/ 18 февраля 2012

В Python 2.x оператор / является целочисленным делением. Если вы напишите

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

даст ожидаемый ответ.

3 голосов
/ 18 февраля 2012

Это целочисленное деление. В вашем примере 3/4 оценивается в 0. Однако 3.0/4.0 оценивается в 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

Это поведение было изменено в Python версии 3 и выше. Если вы хотите по умолчанию использовать деление с плавающей запятой, вы можете импортировать правило.

>>> from __future__ import division
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
420.25
1 голос
/ 18 февраля 2012

важно отметить, что ни python, ни WolframAlpha не дадут вам математически правильного ответа, поскольку в математике мы делаем умножение перед делением и в python * и / имеем одинаковый приоритет, поэтому будем оценивать слева направо.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...