web-dev-qa-db-ja.com

Python整数除算はfloatを生成します

Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

これは意図したものですか? int/int=intを返す以前のバージョンを強く覚えていますか?どうすればよいですか、新しい除算演算子がありますか、それとも常にキャストする必要がありますか?

190
Jonas Byström

PEP-238 をご覧ください:除算演算子の変更

//演算子を使用すると、フロア分割を明確に要求できます。

247

すぐに2//2が見つかりました。

51
Jonas Byström

それがすぐに誰かを助けるかもしれないことを願っています。

Python 2.7およびPython 3の除算演算子の動作

Python 2.7の場合:デフォルトでは、除算演算子は整数出力を返します。

結果をダブルで取得するにはmultiple 1. to "dividend or divisor"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

Python 3で

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real
34
VijayNaidu

受け入れられた答えはすでに PEP 238 に言及しています。 PEP全体を読むことなく、何が起こっているのかに興味がある人のために、舞台裏を簡単に見たいだけです。

Pythonは、+-*/などの演算子を特別な関数にマップします。 a + bは次と同等です

a.__add__(b)

Python 2の除算については、デフォルトでは/のみが__div__にマッピングされ、結果は入力タイプに依存します(例:intfloat)。

Python 2.2は__future__機能divisionを導入し、除算のセマンティクスを次のように変更しました(TL; DR of PEP 238):

  • /__truediv__にマップされ、「除算の数学的な結果の合理的な近似値を返す」必要があります(PEP 238からの引用)
  • //__floordiv__にマッピングされ、/のフロアされた結果を返すはずです

Python 3.0では、PEP 238の変更がデフォルトの動作になり、Pythonのオブジェクトモデルには特別なメソッド__div__はありません。

Python 2とPython 3で同じコードを使用する場合は、

from __future__ import division

///のPEP 238セマンティクスに固執します。

20
code_onkel