2016-03-02 59 views
2

花了很长时间来跟踪它基本上是归结到我假设两以下modulos将返回大于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

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

Decimal对象上的算术和整数和浮点数上的算术有一些小的差异。当其余的操作符%适用于小数的对象,结果的符号是被除数的符号,而不是除数的符号:

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

0

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

remainder(x, y)

返回从整数除法的余数。

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

,此外:

%//运营商实现如在本说明书中描述的remainderdivide-integer操作(分别地)。

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

+0

该差异也在文档主“Decimal”部分中明确指出:“将余数运算符%应用于Decimal对象时,结果的符号是除数的符号而不是除数的符号: “ –

+0

虽然认为这种不一致令人讨厌,对于'Decimal'对象,'%'和'//'未定义可能会更好。 –

相关问题