7

コンテキストを確立するために、私は整数演算についてのみ話します。大きな整数では、浮動小数点を経由することはできません。負の数を使用するため、フロア分割と切り捨て分割の違いが重要になります。

負の整数で除算を実行する場合、一般的なハードウェアおよびCファミリのプログラミング言語では、切り捨てられた結果(1 / -2 = 0など)が得られます。Python2では、フロア化された結果(1 / -2 = -1など)が得られます。

どちらが本質的に優れているかについての議論にもかかわらず、Pythonに切り捨てられた結果を与える方法はありますか?2ではなくPython3を使用した場合、違いはありますか?

4

4 に答える 4

7

解決策が必要な場合は、数値を切り捨てることを忘れないでくださいint。整数除算を行う代わりに、floatを次のように切り捨ててください。int

int(1./-2)

Python 3.Xを使用している場合は、次のことができます。

int(1/2)

将来からPy2.Xインポート部門で同じ動作が必要な場合

from __future__ import division
int(1/2)

この動作の正確な理由を知りたい場合は、このすばらしい記事「Pythonの整数除法の原理」を読んでください。


除算にfloatを使用する際の苦境を見て、これは私がテストした限りでは機能しているように見える代替アプローチです。あなたが直面している問題を私に知らせてください

>>> def trunc_div(a,b):
    q, r = divmod(a,b)
    if  q < 0 and r:
        q += 1
    return q

>>> trunc_div(1,-2)
0
>>> trunc_div(999999999999999999999999999999999999999999, -2)
-499999999999999999999999999999999999999999L
>>> trunc_div(999999999999999999999999999999999999999999, 2)
499999999999999999999999999999999999999999L
>>> trunc_div(1,2)
0
>>> 
于 2013-03-26T09:48:47.713 に答える
1

Python 3には新しいスタイルの分割があります(これはPython 2でもトリガーできますfrom __future__ import division):

>>> from __future__ import division
>>> -1 / 2
-0.5
>>> -1 // 2
-1

切り捨てられた除算を取得できるとは思いません。おそらくmath.floor()を使用する必要があります。

于 2013-03-26T09:47:43.323 に答える
1

これで問題は解決すると思いますが、これは関数呼び出しであり、単純な操作ではありません。

def truncdiv(a, b):
    if a < 0:
        a = -a
        b = -b
    if b < 0:
        return (a + b + 1) / b
    return a / b
于 2013-03-26T10:18:09.107 に答える
0

gmpy2ライブラリは、切り捨てられた除算をサポートしています。

>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>> 

免責事項:私はgmpy2を維持しています。

于 2013-03-26T13:07:37.913 に答える