Làm thế nào tôi có thể buộc phân chia là điểm nổi trong Python?
Tôi có hai giá trị nguyên a và b, nhưng tôi cần tỷ lệ của chúng trong dấu phẩy động. Tôi biết rằng a <b và tôi muốn tính a / b, vì vậy nếu tôi sử dụng phép chia số nguyên, tôi sẽ luôn nhận được 0 với phần còn lại của a.
Làm thế nào tôi có thể buộc c là số dấu phẩy động trong Python sau đây?
c = a / b
Điều thực sự được hỏi ở đây là:
"Làm thế nào để tôi buộc phân chia thực sự như vậy a / b
sẽ trả lại một phần?"
Nâng cấp lên Python 3
Trong Python 3, để có được sự phân chia thực sự, bạn chỉ cần làm a / b
.
>>> 1/2
0.5
Phân chia tầng, hành vi phân chia cổ điển cho số nguyên, hiện là a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Tuy nhiên, bạn có thể bị kẹt khi sử dụng Python 2 hoặc bạn có thể đang viết mã phải hoạt động trong cả 2 và 3.
Nếu sử dụng Python 2
Trong Python 2, nó không đơn giản như vậy. Một số cách đối phó với phân chia Python 2 cổ điển tốt hơn và mạnh mẽ hơn các cách khác.
Khuyến nghị cho Python 2
Bạn có thể nhận hành vi phân chia Python 3 trong bất kỳ mô-đun đã cho nào với lần nhập sau ở trên cùng:
from __future__ import division
sau đó áp dụng phân chia kiểu Python 3 cho toàn bộ mô-đun. Nó cũng hoạt động trong vỏ trăn tại bất kỳ điểm nào. Trong Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Đây thực sự là giải pháp tốt nhất vì nó đảm bảo mã trong mô-đun của bạn tương thích hơn với Python 3.
Các tùy chọn khác cho Python 2
Nếu bạn không muốn áp dụng điều này cho toàn bộ mô-đun, bạn sẽ bị giới hạn trong một vài cách giải quyết. Phổ biến nhất là ép buộc một trong các toán hạng thành float. Một giải pháp mạnh mẽ là a / (b * 1.0)
. Trong một vỏ Python tươi:
>>> 1/(2 * 1.0)
0.5
Cũng mạnh mẽ là truediv
từ operator
mô-đun operator.truediv(a, b)
, nhưng điều này có thể chậm hơn vì đó là một cuộc gọi chức năng:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Không được đề xuất cho Python 2
Thường thấy là a / float(b)
. Điều này sẽ tăng TypeError nếu b là một số phức. Vì phép chia với số phức được xác định, nên tôi không có phép chia không thành công khi truyền số phức cho số chia.
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
Nó không có ý nghĩa với tôi để cố tình làm cho mã của bạn dễ vỡ hơn.
Bạn cũng có thể chạy Python bằng -Qnew
cờ, nhưng điều này có nhược điểm là thực thi tất cả các mô-đun với hành vi Python 3 mới và một số mô-đun của bạn có thể mong đợi phân chia cổ điển, vì vậy tôi không khuyên bạn nên làm điều này trừ khi thử nghiệm. Nhưng để chứng minh:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j