2012-11-10 40 views
9

Hãy xem này:Python lạ int hành vi

print 41063625 ** (1.0/3) # cube-root(41063625) = 345 
print int(345.0) 
print int(41063625 ** (1.0/3)) 

Nó ra:

345.0 
345 
344 

Tôi đã chờ đợi dòng cuối cùng là 345, vì tôi đã mong int(41063625 ** (1.0/3)) để bằng int(345.0) để ở lần lượt bằng 345, như hai kết quả đầu ra khác đề nghị. Tuy nhiên, điều này rõ ràng không phải là trường hợp. Bất cứ ai có thể cho tôi bất kỳ cái nhìn sâu sắc như những gì đang xảy ra ở đây?

Trả lời

12

In (hoặc thay vì float.__str__) làm tròn đầu ra.

In [22]: str(41063625 ** (1.0/3)) 
Out[22]: '345.0' 

Các đại diện dấu chấm động cho 41063625 ** (1.0/3) là ít hơn 345, vì vậy khi bạn lấy int của nó, bạn sẽ có được 344 chứ không phải 345.

In [15]: 41063625 ** (1.0/3) 
Out[15]: 344.9999999999999 

In [16]: int(345.0) 
Out[16]: 345 

In [17]: int(41063625 ** (1.0/3)) 
Out[17]: 344 

Nếu bạn muốn int gần nhất, bạn có thể sử dụng vòng:

In [18]: round(41063625 ** (1.0/3)) 
Out[18]: 345.0 

hay, để có được một int:

In [19]: int(round(41063625 ** (1.0/3))) 
Out[19]: 345 
+0

Ah được rồi, điều đó có ý nghĩa - không biết đó là một tính năng của 'in' tròn như thế. Cảm ơn! – arshajii

+1

Nó có thể được minh họa để đăng đầu ra của 'str (41063625 ** (1.0/3))' vì đó là những gì 'in' thực sự in. – mgilson

+0

@mgilson: Cảm ơn; được thêm vào. – unutbu

1

41063625 ** (1.0/3) không phải là 345,0:

In [7]: 41063625 ** (1.0/3) 
Out[7]: 344.9999999999999 

In [8]: int(344.9999999999999) 
Out[8]: 344 
0

Vâng, những gì tôi nhận được từ các tính toán là một cái gì đó như thế này:

>>> 41063625 ** (1.0/3) 
344.9999999999999 
>>> int(345.0) 
345 
>>> int(41063625 ** (1.0/3)) 
344 

Vì vậy, nhận được 344 là hoàn toàn đúng. Biểu diễn nội bộ của các số dấu phẩy động thiếu một số độ chính xác, do đó, việc đúc thành int sẽ luôn cung cấp giá trị sàn.

Bạn có thể sử dụng chức năng round() để có được giá trị hợp lý hơn.