web-dev-qa-db-ja.com

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

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

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

c = a / b
672
Nathan Fellman

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

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

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


警告:コメント投稿者が指摘したように、これはbが整数または浮動小数点数(あるいはそれらを表す文字列)以外のものであるかもしれない場合はうまくいきません。他のタイプ(複素数など)を扱う場合は、それらをチェックするか別の方法を使用する必要があります。

698
Steve Trout

Pythonで除算を強制的に浮動小数点にする方法はありますか。

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

次に示すように、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つをfloatに強制することです。堅牢なソリューションの1つがa / (b * 1.0)です。新鮮なPythonシェルで:

>>> 1/(2 * 1.0)
0.5

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

>>> 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
178
Aaron Hall
c = a / (b * 1.0)
132
Pinochle

Python 3.xでは、単一のスラッシュ(/)は常に真(切り捨てなし)の除算を意味します。 (//演算子は割り算の切り捨てに使用されます。)Python 2.x(2.2以降)では、次のように入力すると同じ動作になります。

from __future__ import division

モジュールの上部にあります。

65
newacct

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

例:

>>> 4.0/3
1.3333333333333333

または、

>>> 4 / 3.0
1.3333333333333333

または、

>>> 4 / float(3)
1.3333333333333333

または、

>>> float(4) / 3
1.3333333333333333
29
gsbabil

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

>>> 4/3.
1.3333333333333333

または

>>> from __future__ import division
>>> 4/3
1.3333333333333333
20
Alexander

これも動作します

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

0.2

12
Gaurav Agarwal

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

python -Q new foo.py

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

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

Pythonのmanページを見れば、除算の振る舞いを変更/警告する他のflags値についてもっと学ぶことができます。

除算変更の詳細については、 PEP 238 - 除算演算子の変更 を参照してください。

6
stephenbez

あなたが2つの整数の除算をするなら、Pythonはあなたに整数を返すでしょう、そしてあなたはする必要があります:

c = float(a)/b

または

c = a/float(b)

そしてcfloat型として取得します

from operator import truediv

c = truediv(a, b)
3
JoeCondron

これも動作します

u = 1/5印刷する

0.2

13:13に回答しました19:58 Gaurav Agarwal 6,7172279140

Gaurawのおかげで、これはトリックを行い、非常にきちんとした解決策です。分子と分母の両方が変数の場合、「解」は1.に商を掛けたものになる可能性があります。

例:

aa = 2
bb = 3

aa / bb = 0

1. * aa / bb = 0.6666666666666666

;-)

マックス - イタリア

1
Max1234-ITA
from operator import truediv

c = truediv(a, b)

ここで、aは被除数、bは除数です。この関数は、2つの整数の除算後の商がfloatの場合に便利です。

1
Chetan Yeshi