Python整数除算は浮動小数点数を生成します


223
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か?どうすればいいですか、新しい除算オペレーターはいますか、それとも常にキャストする必要がありますか?


31
はい、それが3.xで除算が機能する方法です。
hughdbrown 2009

2
ここでは、どのように丸め作品について話して、Pythonの生みの親によってポストそれはあなたの質問に直交するのですが、私はそれが面白い見つかった:python-history.blogspot.com/2010/08/...
アーロンD

@hughdbrownは、本質的にすべての python 3バージョンを意味しますか?
チャーリーパーカー

@hughdbrown:はい、PEP最終版です。つまり、受け入れられ、実装されています。
JonasByström2017年

回答:


285

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

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


10
@JonathanSternberg(Python 2.0用に作成されたすべてのコードを除く)。/と//の役割は、下位互換性を維持するために逆にする必要があるように感じます。また、ほとんどすべての他の言語で/タイプを保持します。//ではなく、//を浮動小数点に自動的に変換する方が理にかなっています。
タン

1
2番目の部分(「Also」の後)は理にかなっていますが(他の言語と同様)、1番目の部分に関しては、Python 3の全体のポイントはPython 2との下位互換性ではなく、Pythonに関する多くの問題を修正することでした2. /Pythonで修正する必要のある言語設計の「間違い」で十分であるというあいまいさを十分な数の人々が発見しました。変化を愛するグループで私を数えてください。私たち全員が反対することに同意できるのは素晴らしいことです。乾杯。:)
Ray Toal

59

おっと、すぐに見つかりました2//2


5
詳しく説明してもらえますか?
blueFast

4
これを使用すると、float @dangonfastではなく、intが出力されます。
Ashish Ahuja、

これは負の数では機能しないようです。-1 // 5は-1を返し、-5 // 5は-1を返します。
mschuett

@mschuett:これは予想される、とPython 2と同様の結果である
ジョナスByström

1
ええ、私はさらに掘り下げてみましたが、それもわかりました。しかし、私はまともなサイズの人々が彼らの出身言語によってはこれを理解していないと想像します。
mschuett

45

それが誰かを瞬時に助けることを願っています。

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

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

「被除数または除数」への倍数1.0の結果を得るには

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

1
ちなみに、1.0を掛ける必要はありません。数値の1つが浮動小数点数で十分です。たとえば、100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy

21

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

Pythonはのような演算子をマッピングし+-*および/例えばような、特別な機能にa + b同等です

a.__add__(b)

Python 2での除算に関しては、デフォルトでは、/どの型にマップさ__div__れ、結果は入力タイプに依存するだけです(例えばintfloat)。

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

  • /__truediv__「除算の数学的結果の合理的な近似値を返す」必要があるマップ(PEP 238からの引用)
  • //にマップされます__floordiv__。これは、/

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

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

from __future__ import division

スティックのPEP 238意味論へ///


0

Python3のドキュメントによると、Pythonを整数で除算すると、整数であることが予期されているにもかかわらず浮動小数点数が生成されます。

整数のみを出力するには、を使用しますfloor division method。フロア除算はゼロを四捨五入し、小数点を削除しています。Represented by //

したがって、2/2の代わりに、 2//2

__future__python2またはpython3の使用に関係なく、から部門をインポートすることもできます。

それが役に立てば幸い!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.