2010-02-07 20 views
14

Tôi đã nhận thấy sự triển khai khác nhau của toán tử mô-đun trong Python và Java.Sự khác biệt giữa việc thực hiện mô-đun trong Python Vs Java

Ví dụ, trong Python:

>>> print -300 % 800 
>>> 500 

Trong khi trong Java:

System.out.println(-300 % 800); 
-300 

này bắt tôi mất cảnh giác, vì tôi nghĩ một cái gì đó cơ bản như mô đun đã được phổ biến giải thích theo cùng một cách. Tôi là một fan hâm mộ của giải thích Python (mà tôi đoán là vay mượn từ C), mặc dù tôi thấy logic đằng sau việc thực hiện Java.

Bạn thường thích loại nào? Có lý do cụ thể nào cho các cách giải thích khác nhau không? Tôi không có ý định bắt đầu một cuộc chiến tranh ngôn ngữ, đơn giản là tò mò.

+1

Nếu tôi đang đọc trang Wikipedia mà Alex đăng chính xác, math.fmod của Python sẽ trả lại kết quả tương tự như mod của Java. –

Trả lời

6

Tôi thích diễn giải của C (cũng được sử dụng bằng Python), trong đó % thực sự là một toán tử mô đun. Tốt thảo luận trong các wikipedia page và các liên kết từ nó (bao gồm một chút về lý do tại sao thay vì các dấu hiệu của cổ tức có thể dẫn đến một lỗi ngớ ngẩn trừ khi cẩn thận ;-).

+0

C99 sử dụng dấu hiệu của cổ tức, C89 phụ thuộc vào việc triển khai, ít nhất là theo bài viết bạn đã liên kết. – ergosys

+0

Bạn có thể sử dụng '%' trong Java để viết một hàm thực hiện tương tự như Python; xem http://stackoverflow.com/a/3417242/320036 – z0r

+0

C hoạt động như Java, không phải Python. – ryancerium

1

Trong tiêu chuẩn C, modulo phủ định không xác định và nhiều trình biên dịch C sẽ cung cấp cho bạn những gì Java đang cung cấp cho bạn. Tuy nhiên, trong python, bạn sẽ luôn nhận được một số dương, thường hữu ích hơn, bởi vì nó có nghĩa là bạn có thể làm phép cộng và trừ modulo. Nếu modulo âm tính cho bạn âm tính, nó sẽ không hoạt động đúng.

Tôi không biết lợi ích nào nhận được số âm từ modulo.

0

Tôi thích x mod n để cung cấp số từ 0 đến n-1 hoặc giữa tầng (n/2) -n và sàn (n/2); điều này làm cho nó dễ dàng nhất để làm toán trong đầu của một người.

Miễn là mọi thứ tương đương, tôi không thực sự quan tâm khi nói đến ngôn ngữ - mặc dù người ta không phải nhận thức về quy ước. Ngẫu nhiên, Java không thể hoàn toàn quyết định -% trên số nguyên âm trả về giá trị âm, phương pháp mod của java.math.BigInteger trả về giá trị giữa 0 và n-1 (bao gồm) và phương thức divideAndRemainder lại trả về giá trị âm giá trị cho số nguyên âm.

3

Bây giờ thử điều này:

>>> print 300 % -800 
-500 

Lý do cho sự khác biệt là nhà thiết kế ngôn ngữ dường như không thể quyết định xem phần còn lại sau khi bộ phận nên có dấu hiệu của cổ tức hoặc ước. Một số ngôn ngữ thậm chí không chỉ định một hoặc một ngôn ngữ khác, do đó, nó phụ thuộc vào người triển khai.

Có danh sách ngôn ngữ, toán tử và ký hiệu mong đợi trên trang Wikipedia Modulo operation. Đó là một nơi tốt để bắt đầu, nhưng tôi thường chỉ cần chạy một vài xét nghiệm đơn giản để đảm bảo rằng tôi biết chính xác cách % sẽ hoạt động trước khi tôi sử dụng nó bằng bất kỳ ngôn ngữ nào mà trước đây tôi chưa thử nghiệm.

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