8

他の答えを調べていましたが、Pythonの負の数のモジュロがまだわかりません

たとえば、dfによる回答

x == (x/y)*y + (x%y)

したがって、(-2)%5 = -2-(-2/5)* 5=3であることは理にかなっています

これは(-2-(-2/5)* 5)= 0ではないですか、それとも私はただ夢中ですか? 負の値を使用したモジュラス演算-奇妙なことですか?

Pythonのモジュロのこの負の数と同じ 彼はどこから-2を取得しましたか?

最後に、符号が配当に依存している場合、なぜ負の配当は正の配当と同じ出力を持たないのですか?

たとえば、の出力

print([8%5,-8%5,4%5,-4%5])

[3, 2, 4, 1]
4

6 に答える 6

11

Pythonでは、モジュロは2つのルールに従って計算されます。

  • (a // b) * b + (a % b) == a、 と
  • a % bと同じ符号がありbます。

これを整数除算が(-∞に向かって)切り捨てられるという事実と組み合わせると、結果として生じる動作が説明されます。

を実行すると-8 // 5、-1.6が切り捨てられ、-2になります。これに5を掛けると、-10になります。2は、-8を取得するために追加する必要がある数値です。したがって、-8 % 5は2です。

于 2012-04-08T14:38:56.787 に答える
7

Pythonでは、a // b整数除算がtrunc(a / b)として定義されている他のほとんどの言語とは対照的に、floor(a / b)として定義されています。a % b=の解釈には対応する違いがありa - (a // b) * bます。

この理由は、Pythonの%演算子(およびdivmod)の定義は、一般的に他の言語の定義よりも有用であるためです。例えば:

def time_of_day(seconds_since_epoch):
    minutes, seconds = divmod(seconds_since_epoch, 60)
    hours, minutes = divmod(minutes, 60)
    days, hours = divmod(hours, 24)
    return '%02d:%02d:%02d' % (hours, minutes, seconds)

この関数を使用すると、期待どおりにをtime_of_day(12345)返します。'03:25:45'

しかし、エポックの12345秒は何時ですか?Pythonのの定義ではdivmodtime_of_day(-12345)を正しく返します'20:34:15'

divmodとのC定義を使用するように再定義するとどう/なり%ますか?

def divmod(a, b):
    q = int(a / b)   # I'm using 3.x
    r = a - b * q
    return (q, r)

ここで、をtime_of_day(-12345)返します'-3:-25:-45'。これは有効な時刻ではありません。標準のPythondivmod関数がこのように実装されている場合、負の入力を処理するための特殊なケースのコードを作成する必要があります。しかし、私の最初の例のように、フロアスタイルの分割では、それはちょうど機能します。

于 2012-04-09T13:51:25.790 に答える
3

この背後にある理論的根拠は、実際には最小残差の数学的定義です。Pythonはこの定義を尊重しますが、他のほとんどのプログラミング言語では、モジュラス演算子は実際には「除算後のリーマインダー」演算子に似ています。の最小の残差を計算するに-5 % 11は、範囲内の正の整数が得られるまで11を-5に加算するだけ[0,10]で、結果は6になります。

于 2012-04-08T14:41:28.707 に答える
0

int(-2/5)* 5を除算すると、慣れている代数のように-2とは評価されません。それを2つのステップに分けてみてください。最初に、括弧内の部分を評価します。

  1. (-2/5)* 5 =(-1)* 5
  2. (-1)* 5 = -5

手順1の理由は、int除算を実行しているためです。これは、Python 2.xで、最も近い整数に切り捨てられたfloat除算の結果に相当するものを返します。

Python 3以降では、2/5はfloatを返します。PEP238を参照してください。

于 2012-04-08T14:38:46.807 に答える
0

このBetterExplainedの記事をチェックし、 @ Davidのコメント(No. 6)を見て、他の人が話していることを確認してください。

整数で作業しているので、PythonではCではなく答えをにするint除算を行います。詳細については、Guidoの記事を参照してください。

あなたの質問について:

>>> 8 % 5  #B'coz (5*1) + *3* = 8
3
>>> -8 % 5 #B'coz (5*-2) + *2* = -8
2

お役に立てば幸いです。それは最初も私を混乱させました(それはまだそうです)!:)

于 2012-04-08T14:38:56.350 に答える
0

-a%bを計算する必要があるとします。例:r = 11%10は、10で完全に割り切れる11の後の次の数を見つけます。つまり、11の後の次の数を除算すると、余りは0になります。

上記の場合、その20を10で割ると0になります。したがって、20-11=9は11に追加する必要のある数です。

60個のビー玉を8人に均等に分割する必要がある場合、実際には、ビー玉を半分にできないため、60/8を分割した後に得られる値は7.5です。60の次の値は、8で完全に割り切れる64です。したがって4誰もがビー玉の同じ喜びを共有できるように、より多くのビー玉をロットに追加する必要があります。

これは、負の数がモジュラス演算子を使用して除算されるときにPythonが行う方法です。

于 2018-03-14T08:28:53.350 に答える