web-dev-qa-db-ja.com

Pythonディビジョン

-100から0までの数字のセットを10から100までの範囲に正規化しようとしていましたが、まったく変数がなくても、期待する方法が評価されないことに気付くだけで問題がありました。

>>> (20-10) / (100-10)
0

フロート除算も機能しません。

>>> float((20-10) / (100-10))
0.0

分割のどちらかの側がfloat型にキャストされていればうまくいきます。

>>> (20-10) / float((100-10))
0.1111111111111111

最初の例のそれぞれの側はintとして評価しています。これは最終的な答えがintにキャストされることを意味します。 0.111は0.5未満なので、0に丸められます。私の意見では透明ではありませんが、それがそのような方法であると私は思います。

説明は何ですか?

125
Adam Nelson

Python 2.xを使用しています。整数の除算は浮動小数点数にならずに切り捨てられます。

>>> 1 / 2
0

そのうちの1つをfloatにする必要があります。

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

またはfrom __future__ import divisionは、/が常にfloatを返すPython 3.xの動作を採用するように強制します。

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
238
kennytm

あなたは Pythonに整数を返すように整数を入れる

>>> 10 / 90
0

後でこれをfloatにキャストした場合、丸めはすでに行われているはずです。つまり、0の整数は常に0のfloatになります。

分割の両側でフロートを使用すると、Pythonがあなたに期待する答えを与えてくれるでしょう。

>>> 10 / 90.0
0.1111111111111111

だからあなたの場合:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
19
Dave Webb

除算する前に、浮動小数点数に変更する必要があります。あれは:

float(20 - 10) / (100 - 10)
11
A. Levy

Python 2.7では、入力が整数の場合、/演算子は整数の除算になります。

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

Python 3.3では、入力が整数であっても/演算子はfloat除算です。

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

Python 3の整数除算では、//演算子を使います。

//演算子は、Python 2.7とPython 3.3の両方で整数除算演算子です。

Python 2.7とPython 3.3では:

>>>20//15
1

今、比較を見てください

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

上記のプログラムの場合、出力はPython 2.7ではFalse、Python 3.3ではTrueになります。

Python 2.7では、a = 1.75、b = 1です。

Python 3.3では、/がfloat除算であるという理由だけで、a = 1.75およびb = 1.75です。

9
Harsha Vardhan

それはあなたが使っているPythonのバージョンと関係があります。基本的にはCの動作を採用しています。2つの整数を除算すると、結果は整数に切り捨てられます。また、Pythonは左から右へ操作を実行することにも注意してください。これは、型キャストするときに役割を果たします。

例:これは、算術演算を実行しているときに頭に浮かぶ問題です(floatとどの数値に変換する必要があるか)ので、その側面からの例を示します。

>>> a = 1/2/3/4/5/4/3
>>> a
0

整数を分割すると、当然のことながら丸められます。

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0

浮動小数点数の最後の整数を型キャストすると、整数の除算のために数値が浮動小数点数で除算されるまでにすでに0になっているので、まだ0になります。

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0

上記と同じシナリオですが、浮動小数点型キャストを少し左側にシフトします。

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

最後に、浮動小数点の最初の整数を型キャストすると、最初の整数、つまり左端の整数からフロートを使用するので、結果は目的の整数になります。

追加1:算術評価を改善するためにそれに答えようとしているなら、あなたは this をチェックするべきです

追加2:以下のシナリオに注意してください。

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
8
George

'。'を配置してfloatを指定する数の後でも、デフォルトでfloatになります。

>>> 1 / 2
0

>>> 1. / 2.
0.5
4
billmanH

少なくとも1つをフロートにすると、整数ではなくフロート除算になります。

>>> (20.0-10) / (100-10)
0.1111111111111111

結果をfloatにキャストするのは遅すぎます。

2
unbeli

Pythonではcv2は除算計算を更新していません。そのため、プログラムの最初の行にfrom __future__ import divisionを含める必要があります。

1
Kavitha Raj

個人的には、最初に1. *を挿入するのが好きです。そのため、式は次のようになります。

1. * (20-10) / (100-10)

私はいつものようにいくつかの式の除算をするように:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

そのため、単に.0のように20.0を追加することは不可能です。私の場合、float()でラッピングすると読みやすさが少し落ちるかもしれません。

0
FredWe

どちらにせよ、それは整数除算です。 10/90 =0。2番目のケースでは、0をfloatにキャストするだけです。

"/"のオペランドの1つをfloatにキャストしてみてください。

float(20-10) / (100-10)
0
Fred Larson

2番目の例では、除算がすでに行われた後に浮動するようにキャストしています。これを試して:

float(20-10) / float(100-10)
0
David M

オリジナルのポスターが有理数の結果を好むかもしれないと誰も述べていないことに私は幾分驚きます。これに興味があるなら、Pythonベースのプログラム Sageがあなたの背中にある です。 (現在はまだPython 2.xに基づいていますが、3.xは進行中です。)

sage: (20-10) / (100-10)
1/9

なぜなら、これらの数はintsではなく、SageのIntegerクラス要素であるからです。それでも、Pythonエコシステムの一部として言及する価値があります。

0
kcrisman