2015-04-09 6 views
8

Sono abbastanza confuso con il comportamento come illustrato di seguito:Diverso risultato di modulo e interger Divison per galleggiante e decimale

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

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

qualcuno può spiegare?

+4

correlati: [questo bug report.] (Http://bugs.python.org/issue12005) – Makoto

+2

Entrambi sono corrette, ma si basano su diverse definizioni del funzionamento modulo ambiguo se applicato a numeri negativi - ' 3 * -3 + 2 == -7', e '3 * -2-1 == -7'. Un particolare linguaggio/libreria/implementazione di solito sceglie una definizione, quindi il fatto che gli interi nativi e il 'Decimale 'si comportino diversamente in questa versione di Python può certamente essere considerato un bug - è almeno una incoerenza sorprendente, come hai notato. Probabilmente è anche una decisione intenzionale, ma non ho idea di quale potrebbe essere la logica se fosse ... – twalberg

+4

@twalberg: il modulo decimale di Python segue direttamente lo standard decimale IBM, che specifica un operatore rimanente con la semantica mostrata. Quindi, quando fu introdotto il modulo decimale, dovemmo seguire quelle semantiche piuttosto che quelle già esistenti per il tipo 'float'. Questa è la ragione per la differenza. Potremmo * aver * scelto di non sovrascrivere '%' per gli oggetti decimali, e rendere l'operazione resto specificata disponibile come metodo, ma è più conveniente avere la spelling '%' disponibile. (La praticità batte la purezza, e tutto il resto.) –

risposta

5

citando il decimal documentation:

ci sono alcune piccole differenze tra l'aritmetica su Decimale oggetti e aritmetica su numeri interi e carri allegorici. Se la restante operatore % viene applicato agli oggetti decimale, il segno del risultato è il segno di dividendo anziché il segno del divisore:

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

L'operatore divisione intera // comporta analogamente, restituendo la parte intera del vera quoziente (troncando verso zero) piuttosto rispetto al suo piano, in modo da preservare il solito identità x == (x // y) * y + x% y:

>>> -7 // 4 
-2 
>>> Decimal(-7) // Decimal(4) 
Decimal('-1') 
Problemi correlati