2015-04-09 27 views
8

tôi khá bối rối với hành vi như hình dưới đây:kết quả khác nhau của modulo và interger KHỐI cho phao và Decimal

>>> (-7) % 3 
2 
>>> Decimal('-7') % Decimal('3') 
Decimal('-1') 
>>> 

>>> (-7) // 3 
-3 
>>> Decimal('-7') // Decimal('3') 
Decimal('-2') 
>>> 

Ai đó có thể xin giải thích?

+4

Related: [báo cáo lỗi này.] (Http://bugs.python.org/issue12005) – Makoto

+2

Cả hai đều đúng, nhưng dựa trên các định nghĩa khác nhau về hoạt động mô đun mơ hồ khi được áp dụng cho số âm - ' 3 * -3 + 2 == -7' và '3 * -2-1 == -7'. Một ngôn ngữ/thư viện/triển khai cụ thể thường chọn một định nghĩa, do đó, thực tế là các số nguyên gốc và 'thập phân' hoạt động khác trong phiên bản Python này chắc chắn có thể được coi là lỗi - ít nhất là sự mâu thuẫn đáng ngạc nhiên. Nó có thể là một quyết định có chủ ý, tuy nhiên, nhưng tôi không biết lý do có thể là gì ... – twalberg

+4

@twalberg: Mô-đun thập phân của Python trực tiếp theo tiêu chuẩn thập phân của IBM, chỉ định toán tử còn lại với ngữ nghĩa được hiển thị. Vì vậy, khi mô-đun thập phân được giới thiệu, chúng tôi phải tuân theo các ngữ nghĩa đó thay vì các ngữ nghĩa đã tồn tại cho loại 'float'. Đó là lý do cho sự khác biệt. Chúng tôi * có thể * đã chọn không ghi đè '%' ở tất cả các đối tượng thập phân, và chỉ thực hiện thao tác còn lại được chỉ định sẵn có như một phương thức, nhưng thuận tiện hơn để có sẵn '%' chính tả. (Thực tế đánh bại sự tinh khiết, và tất cả điều đó.) –

Trả lời

5

Trích dẫn các decimal documentation:

Có một số khác biệt nhỏ giữa số học trên số thập phân đối tượng và số học trên số nguyên và nổi. Khi thời gian còn lại điều hành % được áp dụng cho đối tượng Decimal, dấu hiệu của kết quả là dấu hiệu của cổ tức chứ không phải là dấu hiệu của số chia:

>>> (-7) % 4 
1 
>>> Decimal(-7) % Decimal(4) 
Decimal('-3') 

Nhà điều hành phân chia số nguyên // cư xử Tương tự, trả lại một phần số nguyên của thương đúng (cắt xén đối không) chứ không phải hơn sàn của nó, để giữ gìn bản sắc thông thường x == (x // y) * y + x% so với:

>>> -7 // 4 
-2 
>>> Decimal(-7) // Decimal(4) 
Decimal('-1') 
Các vấn đề liên quan