どのように私は、浮動小数点除算することを強制することができますか?部門は0に切り捨て続けますか?
-
13-09-2019 - |
質問
私は2つの整数値a
とb
を持ったが、私は、浮動小数点での比率を必要とします。私はその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は除数です。 二つの整数の除算後の商がフロートの場合、この機能は便利です。