用了很长时间来追踪一个基本上归结为我的错误,假设下面的两个模数都会返回大于0的结果:
>>> -0.09 % 0.1
0.010000000000000009 # OK
>>> Decimal('-0.09') % Decimal('0.1')
Decimal('-0.09') # Not OK -- I expected a positive value!
此行为似乎违反了Python docs:
模运算符总是产生一个结果,与第二个操作数相同的符号(或零)
这是一个错误,还是我做错了什么?
答案 0 :(得分:3)
这不是一个错误。这是Decimal在Python中工作的(不幸)方式,与整数或浮点数不一致:
Decimal对象上的算术与整数和浮点上的算术之间存在一些小的差异。当余数运算符%应用于Decimal对象时,结果的符号是被除数的符号,而不是除数的符号:
答案 1 :(得分:0)
您正在查看错误的文档:您链接的段落适用于内置数字类型(尽管这一点并不明显)。对于decimal
,您需要查看documentation of decimal
。它说:
<强>
remainder(x, y)
强>从整数除法返回余数。
结果的符号,如果非零,则与原始股息的符号相同。
而且,还有:
%
和//
运算符按照规范中的描述实施remainder
和divide-integer
运算。
这种行为不一致的事实当然很烦人。