Python 浮点和十进制的模和整数除法的不同结果

Python 浮点和十进制的模和整数除法的不同结果,python,python-3.x,Python,Python 3.x,我对如下所示的行为感到困惑: >>> (-7) % 3 2 >>> Decimal('-7') % Decimal('3') Decimal('-1') >>> >>> (-7) // 3 -3 >>> Decimal('-7') // Decimal('3') Decimal('-2') >>> 有人能解释一下吗?引用: 十进制对象上的算术运算之间有一些小的差异 以及整数和浮

我对如下所示的行为感到困惑:

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

>>> (-7) // 3
-3
>>> Decimal('-7') // Decimal('3') 
Decimal('-2')
>>>
有人能解释一下吗?

引用:

十进制对象上的算术运算之间有一些小的差异 以及整数和浮点数的算术运算。当余数运算符% 应用于十进制对象时,结果的符号为 除数的符号,而不是除数的符号:

>>> (-7) % 4
1
>>> Decimal(-7) % Decimal(4)
Decimal('-3')
整数除法运算符//的行为类似,返回 真商的整数部分(向零截断)而不是 而不是它的地板,以保持通常的标识x==(x//y)*y +x%y:


相关:两者都是正确的,但当应用于负数-
3*-3+2==-7
3*-2-1=-7
时,基于模糊模运算的不同定义。特定的语言/库/实现通常选择一个定义,因此本机整数和Decimal在这个版本的Python中表现不同的事实当然可以被认为是一个bug——正如您所指出的,这至少是一个令人惊讶的不一致性。虽然这也可能是一个有意的决定,但我不知道如果它是…@twalberg:Python的decimal模块直接遵循IBM decimal标准,该标准指定了一个具有所示语义的余数运算符,其原理可能是什么。因此,当引入decimal模块时,我们必须遵循那些语义,而不是
float
类型的现有语义。这就是造成差异的原因。我们本可以选择根本不重写十进制对象的
%
,只将指定的余数操作作为一种方法使用,但使用
%
拼写更方便。(实用胜过纯洁,诸如此类。)@Makoto:好发现!我完全忘记了那个错误报告。
>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')