为什么Decimal模数给出了错误的符号?

时间:2016-03-02 11:10:54

标签: python math modulo

用了很长时间来追踪一个基本上归结为我的错误,假设下面的两个模数都会返回大于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

  

模运算符总是产生一个结果,与第二个操作数相同的符号(或零)

这是一个错误,还是我做错了什么?

2 个答案:

答案 0 :(得分:3)

这不是一个错误。这是Decimal在Python中工作的(不幸)方式,与整数或浮点数不一致:

  

Decimal对象上的算术与整数和浮点上的算术之间存在一些小的差异。当余数运算符%应用于Decimal对象时,结果的符号是被除数的符号,而不是除数的符号:

来源:https://docs.python.org/2/library/decimal.html

答案 1 :(得分:0)

您正在查看错误的文档:您链接的段落适用于内置数字类型(尽管这一点并不明显)。对于decimal,您需要查看documentation of decimal。它说:

  

<强> remainder(x, y)

     

从整数除法返回余数。

     

结果的符号,如果非零,则与原始股息的符号相同。

而且,还有:

  

%//运算符按照规范中的描述实施remainderdivide-integer运算。

这种行为不一致的事实当然很烦人。