2015-04-09 10 views
8

jestem bardzo mylić z zachowaniem jak pokazano poniżej:Different wynikiem modulo i interger Division dla pływaka i dziesiętne

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

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

Może ktoś proszę wyjaśnić?

+4

pokrewne: [raport ten bug.] (Http://bugs.python.org/issue12005) – Makoto

+2

Obie są poprawne, ale są oparte na różnych definicjach dwuznacznego działania modułu, gdy stosowane do liczb ujemnych - ' 3 * -3 + 2 == -7' i '3 * -2-1 == -7'. Określony język/biblioteka/implementacja zwykle wybiera jedną definicję, więc fakt, że natywne liczby całkowite i "dziesiętne" zachowują się inaczej w tej wersji Pythona, z pewnością można uznać za błąd - jest to przynajmniej zaskakująca niekonsekwencja, jak zauważyłeś. Jest to prawdopodobnie także celowa decyzja, ale nie mam pojęcia, co może być uzasadnione, jeśli jest ... – twalberg

+4

@twalberg: moduł dziesiętny Pythona jest bezpośrednio zgodny ze standardem dziesiętnym IBM, który określa operator pozostały z przedstawioną semantyką. Więc kiedy wprowadzono moduł dziesiętny, musieliśmy stosować te semantyki zamiast tych już istniejących dla typu 'float'. To jest uzasadnienie dla różnicy. Możemy * mogli * zdecydować, aby w ogóle nie przesłonić '%' dla obiektów dziesiętnych i po prostu udostępnić określoną operację pozostałą jako metodę, ale wygodniej jest mieć dostępną '%' pisownię. (Praktyczność bije czystość i tak dalej.) –

Odpowiedz

5

Cytowanie decimal documentation:

Istnieją pewne drobne różnice pomiędzy arytmetycznych na dziesiętne obiektów i arytmetyka na całkowite i pływaków. Gdy reszta operatora % stosuje się dziesiętny obiektów, znak rezultatu jest znakiem dywidendy zamiast znaku dzielnika:

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

Operator dzielenia całkowitego // zachowuje analogicznie powrót część całkowitą prawdziwego iloraz (obcinania do zera), a niż jego podłogi, w taki sposób, aby zachować zwykle tożsamości x == (x) * y // y + x% r:

>>> -7 // 4 
-2 
>>> Decimal(-7) // Decimal(4) 
Decimal('-1') 
Powiązane problemy