Thực tế, có ba định nghĩa khác nhau của "modulo" hoặc "phần còn lại", không phải là hai:
- rút gọn bộ phận còn lại: dấu hiệu cũng giống như số bị chia.
- Phần còn lại phân chia tầng: ký hiệu giống như số chia.
- Phần còn lại của phân chia Euclide: dấu hiệu luôn dương.
Gọi một trong số đó là "modulo" và phần còn lại "" còn lại rất khó hiểu; cả ba đều là định nghĩa hữu ích cho cả hai từ.
Hầu hết mọi ngôn ngữ chỉ cung cấp một trong ba ngôn ngữ (Fortran là ngoại lệ đáng chú ý). * Hầu hết các ngôn ngữ cung cấp ngôn ngữ phù hợp với toán tử phân chia ngôn ngữ. ** Vì Python sử dụng phép chia tầng (theo sau đối số của Knuth trong Lập trình máy tính), nó sử dụng toán tử còn lại phù hợp.
Nếu bạn muốn người khác, bạn phải viết thủ công. Nó không phải là rất khó khăn; this Wikipedia article cho biết cách triển khai cả ba.
Ví dụ:
def trunc_divmod(a, b):
q = a/b
q = -int(-q) if q<0 else int(q)
r = a - b * q
return q, r
Bây giờ, ví dụ của bạn:
>>> q, r = trunc_divmod(-5, 2)
>>> print(q, r)
-2 -1
* Thông thường ngôn ngữ mà cung cấp cả hai cuộc gọi cắt ngắn còn lại một số biến thể trên mod
, và hạ đo ván một số biến thể trên rem
... nhưng đó chắc chắn không phải là thứ để dựa vào. Ví dụ: Fortran gọi số còn lại là số sàn modulo
, trong khi Đề án gọi số dư Euclide là mod
.
** Hai trường hợp ngoại lệ đáng chú ý là C90 và C++ 03, để lại sự lựa chọn tối đa cho việc triển khai. Trong khi nhiều triển khai sử dụng phân chia cắt ngắn và phần còn lại, một số không (một vài thậm chí sử dụng phân chia cắt ngắn và phần còn lại sàn, có nghĩa là a = b * (a/b) + a%b
thậm chí không hoạt động ...).
Có, bạn phải tự mình thực hiện. – katrielalex
có thể trùng lặp của [Tìm số phần còn lại của một số] (http://stackoverflow.com/questions/5584586/find-the-division-remainder-of-a-number) – alecxe
@katrielalex nhưng lập trình là khó: ( – blakev