除算を浮動小数点にするにはどうすればよいですか?除算は0に切り捨て続けますか?


721

私は2つの整数値aとを持っていますbが、浮動小数点での比率が必要です。私はそれを知っていてa < b、計算したいa / bので、整数除算を使用すると、常にの余りで0になりますa

c次のようにPythonで浮動小数点数になるように強制するにはどうすればよいですか?

c = a / b

Python 3にアップグレードするだけです
Boris

回答:


807

Python 2では、2つのintを除算するとintが生成されます。Python 3では、floatを生成します。からインポートすることで、新しい動作を取得できます__future__

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

13
from __future__ import divisionファイルの最初にある必要があることに注意してください
yannis

あなたが一箇所に整数除算をしたいが、ファイルの別の場所でのフロート分裂場合にも問題が...ある
mercury0114

1
@ mercury0114:問題ありません。//床の分割/が必要な場合、および「true」(float)の分割が必要な場合にのみ使用します。
ShadowRanger

715

フロートにキャストすることができc = a / float(b)ます。分子または分母が浮動小数点の場合、結果も同様です。


注意:コメンターが指摘したように、これはb整数または浮動小数点数(または1を表す文字列)以外の場合は機能しません。他の型(複素数など)を処理する可能性がある場合は、それらを確認するか、別の方法を使用する必要があります。


195

Pythonで除算を強制的に浮動小数点にするにはどうすればよいですか?

私は2つの整数値aとbを持っていますが、それらの比率を浮動小数点で必要としています。a <bであることを知っているので、a / bを計算したいので、整数除算を使用すると、常に0になり、残りはaになります。

次のようにPythonでcを強制的に浮動小数点数にするにはどうすればよいですか?

c = a / b

ここで本当に求められているのは:

a / b分数を返すように真の除算を強制するにはどうすればよいですか?」

Python 3にアップグレード

Python 3では、真の除算を取得するには、単にを実行しますa / b

>>> 1/2
0.5

整数の古典的な除算動作であるフロア除算は、次のようになりましたa // b

>>> 1//2
0
>>> 1//2.0
0.0

ただし、Python 2を使用している場合や、2と3の両方で機能する必要があるコードを作成している場合があります。

Python 2を使用している場合

Python 2では、それほど単純ではありません。従来のPython 2除算を処理するいくつかの方法は、他の方法よりも優れており、堅牢です。

Python 2の推奨事項

上部に次のインポートを使用すると、任意のモジュールでPython 3の分割動作を取得できます。

from __future__ import division

次に、Python 3スタイルの分割をモジュール全体に適用します。また、Pythonシェルの任意の時点で機能します。Python 2の場合:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

これは、モジュール内のコードがPython 3との上位互換性を保証するため、本当に最良のソリューションです。

Python 2のその他のオプション

これをモジュール全体に適用したくない場合は、いくつかの回避策に制限されます。最も一般的なのは、オペランドの1つを浮動小数点数に強制変換することです。堅牢なソリューションの1つはa / (b * 1.0)です。新鮮なPythonシェルで:

>>> 1/(2 * 1.0)
0.5

また、堅牢であるtruedivからoperator、モジュールoperator.truediv(a, b)が、それは関数呼び出しだから、これはおそらく遅いです。

>>> from operator import truediv
>>> truediv(1, 2)
0.5

Python 2には非推奨

一般的に見られますa / float(b)。bが複素数の場合、TypeErrorが発生します。複素数による除算が定義されているため、除数に複素数を渡したときに除算が失敗しないようにするのは理にかなっています。

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

意図的にコードをよりもろくすることは、私にはあまり意味がありません。

-Qnewフラグを使用してPythonを実行することもできますが、これにはすべてのモジュールを新しいPython 3の動作で実行することの欠点があり、一部のモジュールは従来の除算を想定している可能性があるため、テスト以外はお勧めしません。しかし、実証するために:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

3
"1 // 2 = 0"、 "1 // 2.0 = 0.0"-整数の除算であっても、少し興味深い点があります。オペランドのいずれかが浮動小数点数の場合、結果は整数ですが浮動小数点数でもあります。整数除算を使用してリストインデックスを計算していたため、エラーが発生していました。
R. Navega


66

Python 3.xでは、単一のスラッシュ(/)は常に真(切り捨てなし)の除算を意味します。(//演算子は除算を切り捨てるために使用されます。)Python 2.x(2.2以降)では、

from __future__ import division

モジュールの上部。


30

除算のパラメーターを浮動小数点形式で作成するだけでも、出力は浮動小数点形式で生成されます。

例:

>>> 4.0/3
1.3333333333333333

または、

>>> 4 / 3.0
1.3333333333333333

または、

>>> 4 / float(3)
1.3333333333333333

または、

>>> float(4) / 3
1.3333333333333333

4
しかし、後でやる気になっ1.0 + 1/3たり、float(c) + a/bあるいはそうしたりするfloat(a/b)と、答えに失望するでしょう。__future__.division常に期待する答えを得るには、python 3+を使用するか、モジュールをインポートする(受け入れられた回答を参照)方が適切です。既存の除算規則は、潜行性があり、追跡が難しい数学エラーを作成します。
ホブ

@JoeCondronやってみましたpython -c 'a=10; b=3.0; print a/b'か?
gsbabil

それがこのシナリオで明らかに機能するので、私はする必要はありませんでした。しかし、もしa'b'の場合、例えば整数値関数の出力はどうでしょうか?例えば、a = len(list1), b = len(list2)
JoeCondron、2015

@JoeCondron:良い点。回答を更新して、を含めましたfloat(..)1.0@Pinochleが以下に示すように、を乗算することも役立つと思います。
gsbabil

21

ドット(.)を追加して浮動小数点数を示します

>>> 4/3.
1.3333333333333333

2
分子と分母が両方とも変数である場合、このアプローチをどのように適用しますか?
stackoverflowuser2010

最初の例を参照していると思いますが、そうであればfloat()、変数の1つだけを使用します。
Alexander

13

これも機能します

>>> u=1./5
>>> print u
0.2

4
そして、分子と分母が両方とも変数である場合、このアプローチをどのように適用しますか?
stackoverflowuser2010 2016

1
変数が抽象化に使用されている場合は機能しないためです。意味のあるコードには、そのようにハードコードされた値はほとんどありません。
キールシモンズ2017

1
この回答は質問に回答せず、一般的な回答でもないため、投票数はほとんどありません。答えとして、なぜこれが機能するのかを最初に示すことも重要です。非常に単純です。分子または分母が浮動小数点数の場合、結果は浮動小数点数になります。通常、プレーンテキストの計算機としてpythonを使用しないため、変数aとの回答が必要ですb
TimZaman 2017

長い間、私は実際./には浮動小数点除算を行うことができるPythonの有効な演算子だと思っていました。これが、どのプログラミング言語でもホワイトスペースを慎重に使用するのが良い理由です
smac89

6

デフォルトで「true」(浮動小数点)除算を使用する場合は、コマンドラインフラグがあります。

python -Q new foo.py

(PEPからの)いくつかの欠点があります。

デフォルトを変更するコマンドラインオプションは悪だと主張されてきました。これは間違いなく危険です。たとえば、-Qnewを必要とするサードパーティのライブラリパッケージと-Qoldを必要とする別のライブラリパッケージを組み合わせるのは不可能です。

python manページを見ると、除算の動作を変更/警告する他のフラグ値について詳しく知ることができます。

部門変更の詳細については、PEP 238-部門オペレーターの変更をご覧ください。


2
from operator import truediv

c = truediv(a, b)

2
ただし、aがintおよびbfloatの場合は機能しないため、これは理想的ではありません。同じ方法でより良い解決策は、を実行from operator import truedivしてから使用することtruediv(a, b)です。
Mark Dickinson

ええ、あなたは正しいです。これは除算演算が異なる唯一の時間なので、両方の整数を想定していましたが、本当に一般的な解決策が必要です。演算子をインポートできることや、浮動小数点除数ではまったく機能しないことを実際には知りませんでした。回答を編集しました。
JoeCondron、2015

1
from operator import truediv

c = truediv(a, b)

ここで、aは被除数、bは除数です。この関数は、2つの整数の除算後の商が浮動小数点である場合に便利です。

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