Arindam Choudhury
Arindam Choudhury

Reputation: 3036

Different result of modulo and integer divison for float and Decimal

I am quite confused with the behaviour as shown below:

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

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

Can someone please explain?

Upvotes: 8

Views: 166

Answers (1)

vaultah
vaultah

Reputation: 46593

Quoting the decimal documentation:

There are some small differences between arithmetic on Decimal objects and arithmetic on integers and floats. When the remainder operator % is applied to Decimal objects, the sign of the result is the sign of the dividend rather than the sign of the divisor:

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

The integer division operator // behaves analogously, returning the integer part of the true quotient (truncating towards zero) rather than its floor, so as to preserve the usual identity x == (x // y) * y + x % y:

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

Upvotes: 5

Related Questions