2009-11-24 43 views
8

Hãy xem xét:Tại sao bộ phận này không hoạt động trong Python?

>>> numerator = 29 
>>> denom = 1009 
>>> print str(float(numerator/denom)) 
0.0 

Làm cách nào để làm cho số thập phân trở lại?

+1

Hơi sang một bên, nhưng 'float' không giống với loại' thập phân 'trong thư viện chuẩn Python. Khi bạn nói "Tôi chỉ muốn nó trả về một số thập phân", điều bạn thực sự muốn nói là "Tôi chỉ muốn nó trả về một chuỗi đại diện cho một giá trị phân số theo ký hiệu thập phân", đúng không? –

Trả lời

24

Cho đến phiên bản 3, toán tử phân chia của Python, /, hoạt động như toán tử phân chia của C khi được trình bày với hai đối số nguyên: nó trả về kết quả nguyên được cắt ngắn khi có phần phân số. Xem: PEP 238

>>> n = 29 
>>> d = 1009 
>>> print str(float(n)/d) 
0.0287413280476 

Trong Python 2 (và có thể sớm hơn), bạn có thể sử dụng:

>>> from __future__ import division 
>>> n/d 
0.028741328047571853 
+0

-7 // 3 = -3 (phần dư là = 2) bằng Python và -7/3 = -2 (phần dư = -1) trong C/C++ vì vậy tôi sẽ không nói hành vi này giống như trong Python như trong C/C++ – Artur

7

Trong Python 2.x, chia làm giống như trong ngôn ngữ C như: nếu cả hai đối số là số nguyên, kết quả được cắt ngắn thành một số nguyên, vì vậy 29/1009 là 0. 0 khi float là 0.0. Để khắc phục, hãy truyền đến một phao trước khi chia:

print str(float(numerator)/denominator) 

Trong Python 3.x, phân đoạn hoạt động tự nhiên hơn, do đó bạn sẽ nhận được kết quả toán học chính xác (trong lỗi dấu phẩy động).

0
print str(float(numerator)/float(denom)) 
+0

Nó đủ để bỏ một trong hai toán hạng vào float(). Tôi thường khuyên bạn nên đúc tử số vì nó đặt dàn diễn viên vào đầu biểu thức, nơi người đọc thường thấy nó dễ dàng hơn. –

+0

Vâng, nhưng điều này có vẻ "phù hợp" hơn với tôi chỉ vì nó minh bạch hơn trong quá trình truyền. Nhưng có, đúc một mình là đủ. – inspectorG4dget

1

Trong đánh giá của bạn, bạn đang truyền kết quả, bạn cần thay vì truyền các toán hạng.

Các vấn đề liên quan