2016-03-02 112 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'對象,'%'和'//'未定義可能會更好。 –