どのように私は、浮動小数点除算することを強制することができますか?部門は0に切り捨て続けますか?

StackOverflow https://stackoverflow.com/questions/1267869

質問

私は2つの整数値abを持ったが、私は、浮動小数点での比率を必要とします。私はそのa < bを知っていると私はa / bを計算したいので、私は整数の除算を使用する場合、私はいつもaの残りの部分で0を取得します。

どのように私はPythonで浮動小数点数であることをcを強制することができ、次の?

c = a / b
役に立ちましたか?

解決

は、Python 2では、2つのintの分割は、INTを生成します。 Pythonの3では、それはフロートを生成します。我々は__future__からインポートすることによって、新たな振る舞いを得ることができます。

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

他のヒント

あなたはc = a / float(b)を行うことによってfloat型にキャストすることができます。分子や分母がfloatの場合、結果もなります。

<時間>

警告:コメンターが指摘したようにbは、整数または浮動小数点数(または1を表す文字列)以外のものである可能性がある場合、これは動作しません。あなたは(複雑な数字のような)他の種類を扱うかもしれない場合は、いずれかのそれらのために確認するか、別の方法を使用する必要があります。

  

どのように私はPythonで浮動小数点除算することを強制することができますか?

     

私は2つの整数値a、bを持っているが、私は、浮動小数点での比率を必要とします。私は      

私は、次の中の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のための

その他のオプション

あなたがモジュール全体にこれを適用したくない場合は、

、あなたはいくつかの回避策に限定しています。最も人気のあるフロートに、オペランドのいずれかを強制することです。一つの堅牢なソリューションを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
c = a / (b * 1.0)

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

を置くことによって、この同じ動作を得ることができます
from __future__ import division

あなたのモジュールの上部にあるます。

ちょうど浮動小数点形式の分割のためのパラメータのいずれかを行うことも浮動小数点で出力を生成します。

例:

>>> 4.0/3
1.3333333333333333

や、

>>> 4 / 3.0
1.3333333333333333

や、

>>> 4 / float(3)
1.3333333333333333

や、

>>> float(4) / 3
1.3333333333333333

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

>>> 4/3.
1.3333333333333333

これも動作します。

>>> u=1./5
>>> print u
0.2
あなたは、デフォルトでは「真」(浮動小数点)除算を使用したい場合は、

、コマンドラインフラグがあります:

python -Q new foo.py

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

  

コマンドラインオプションを変更すると主張されてきました         デフォルトは悪です。それは確かに間違って危険なことができます         手:例えば、第三を組み合わせることは不可能であろう         その別のものと-Qnewを必要パーティのライブラリパッケージ         -Qoldが必要です。

あなたは/警告-についてのpythonのmanページを見て除算の動作変更、他のフラグ値についての詳細を学ぶことができます。

区分の変更に関する完全な詳細については、お読みください。 PEP 238 - 変更課演算子する

from operator import truediv

c = truediv(a, b)
from operator import truediv

c = truediv(a, b)

配当であり、Bは除数です。 二つの整数の除算後の商がフロートの場合、この機能は便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top