2012-02-17 29 views
6

Tôi đã thử nghiệm các khả năng toán học của Python và tôi đã có một số hành vi thú vị. Nó có liên quan đến cụm từ sau:Tại sao Python đánh giá biểu thức này không chính xác?

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

>>> 415 

Tuy nhiên, nếu bạn đánh giá biểu thức theo thứ tự hoạt động chuẩn, câu trả lời phải là 420,25. Tôi cũng đã kiểm tra lại với WolframAlpha, đưa ra câu trả lời là 420,25. Tại sao Python đưa ra một câu trả lời khác? Liệu nó có liên quan gì đến việc nó đánh giá các biểu thức như thế không? Có một số quy ước mà sau đây của nó? Mọi thông tin sẽ được đánh giá cao, cảm ơn!

+0

Tôi đoán là nếu thấy '3/4/5 * 35' mơ hồ và đánh giá nó khác với bạn. Tốt nhất đặt một số dấu ngoặc đơn trong đó – inspectorG4dget

+0

quy tắc ưu tiên của một ngôn ngữ lập trình có thể không và trong trường hợp này không chính xác giống như toán học thông thường. cũng trong toán học thông thường mà biểu thức đánh giá là khoảng 415.00428571428574 – ChessMaster

+0

Bạn đã thử làm ví dụ đơn giản hơn chưa? –

Trả lời

10

Bạn muốn sử dụng phân chia dấu phẩy động. Thay đổi nó để này hoạt động:

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

Một số ví dụ về phân chia số nguyên so với sự phân chia điểm nổi:

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 

Một float chia cho một số nguyên là một hoạt động nổi-điểm. Python 3 đã thay đổi này để phân dấu chấm động là mặc định:

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

Trong Python 2.x toán tử/là phân chia số nguyên. Nếu bạn viết

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

nó sẽ đưa ra câu trả lời mong đợi.

4

Điều đó phụ thuộc vào phiên bản của Python bạn đang chạy:

$ 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 

Trước Python 3, các nhà điều hành / biểu diễn số nguyên phân chia thay vì dấu phẩy động.

7

Bởi vì, trong Python 2, / sử dụng phân chia số nguyên khi cả toán tử và toán hạng là số nguyên.

Bạn có thể thay đổi từ một đến một phao (như người trả lời khác đã gợi ý), hoặc sử dụng from __future__ import division: http://www.python.org/dev/peps/pep-0238/

3

Đó là số nguyên chia. Trong ví dụ của bạn, 3/4 đánh giá là 0. Tuy nhiên, 3.0/4.0 đánh giá là 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 

Hành vi này đã thay đổi trong phiên bản Python 3 trở lên. Nếu bạn muốn nó mặc định cho phân chia dấu phẩy động, bạn có thể nhập quy tắc.

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

cần lưu ý rằng không phải trăn hoặc WolframAlpha sẽ không cung cấp cho bạn câu trả lời về mặt toán học ngay từ trong toán học chúng ta làm phép nhân trước khi phân chia và trong python * và/có ưu tiên tương tự như vậy sẽ đánh giá trái sang phải của nó.

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 
Các vấn đề liên quan