Python除算


133

私は-100から0までの数値のセットを10-100の範囲に正規化しようとしていて、変数がまったくない場合でも、これが期待どおりに評価されないことに気づくだけの問題がありました。

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

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

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

部門のどちらかの側がフロートにキャストされた場合、機能します。

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

最初の例の両側は、intとして評価されています。つまり、最終的な回答がintにキャストされます。0.111は.5より小さいため、0に丸められます。私の見解では、それは透過的ではありませんが、私はそれがそうであると思います。

説明は何ですか?



3
アダム、私はまだあなたの説明が好きではありません。最初の例は整数除算であり、単純に0を返します。2番目の例は、必要な効果のために誤って括弧で囲まれています。
James K. Polk大統領

@GregS最初の例は問題でした。2番目の例は説明のためのもので、最初の質問の後に書かれました。以下のすべての回答は、特に@KennyTMの問題を非常によく説明しています。私の元の問題は3ではなくPython 2.xの問題であることに注意することが重要です。動作がそのように変化するのは少し当惑ですが、今では、将来のインポート部門から使用し、3を使用します.xの動作。乾杯。
アダムネルソン

1
アダム、最後の編集を修正してください。右側には特別なものはありません。除算を浮動小数点数にするためには、分子または分母(または両方)を浮動小数点数にする必要があります。右側をフロートにする必要があるというドキュメントを読んだと思われる場合は、ドキュメントの表現が不適切であり、修正する必要があるか、誤解している。例を見て、それからルールを外挿しましたか?
tzot

回答:


246

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

>>> 1 / 2
0

あなたはそれらの1つをaにする必要がありますfloat

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

またはfrom __future__ import division/常に浮動小数点数を返すPython 3.xの動作を採用することを強制します。

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

10
使用from __future__ import divisionする場合、2つのスラッシュを使用することにより、古いCスタイルの除算動作を取得できます(たとえば、1 // 2結果は0になります)。Pep 238を
ユーザー

1
@Userからインポートする必要はありません__future__。Python 2と3の両方で、デフォルトでを//参照し__floordiv__()ます。
Casimir 2018年

21

あなたは整数を入れているので、Pythonは整数を返します

>>> 10 / 90
0

これを浮動小数点数にキャストした後で丸めが既に行われている場合、つまり、整数0は常に浮動小数点数0になります。

除算のどちらかの側でフロートを使用すると、Pythonが期待する答えを提供します。

>>> 10 / 90.0
0.1111111111111111

だからあなたの場合:

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

11

除算を行う前に、フロートに変更する必要があります。あれは:

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

4
@アダムネルソン:私のために正しく動作します。括弧を確認してください。
Fred Larson

実際、私は間違っています-しかし、ドキュメントを見てから、最初に右側をキャストする必要があります。
Adam Nelson

10
@Adam:どちらが先でもかまいません。
kennytm

11

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

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

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

>>> 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では/、が浮動小数点除算であるという理由だけで、a = 1.75およびb = 1.75 です。


8

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

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

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

整数を除算するとき、当然のことながら、丸めが低くなります。

>>> a = 1/2/3/4/5/4/float(3)
>>> a
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:あなたは算術評価を改善するために、それに答えるためにしようとしている場合は、チェックする必要があり、これを

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

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

4

「。」を配置してフロートを指定する 数値の後も、デフォルトで浮動小数点になります。

>>> 1 / 2
0

>>> 1. / 2.
0.5

2

それらの少なくとも1つを浮動小数点にすると、整数ではなく浮動小数点除算になります。

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

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


1

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


0

いずれにせよ、それは整数除算です。10/90 =0。2番目のケースでは、単に0を浮動小数点数にキャストしています。

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

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

0

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

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

0

元のポスターが有理数を好むかもしれないと誰も言っていなかったことに少し驚いています。これに興味がある場合は、PythonベースのプログラムSageが役立ちます。(現在は3.xが進行中ですが、現在もPython 2.xに基づいています。)

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

これは万人向けのソリューションではありません。これは、いくつかの準備を行うため、これらの数値はintsではなく、Sage Integerクラスの要素であるためです。それでも、Pythonエコシステムの一部として言及する価値があります。


0

個人的に1. *は、最初にaを挿入することを好みました。したがって、式は次のようになります。

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

私はいつも次のような式の除算をするので:

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

したがって、単純に「いい.0ね!」を追加することは不可能20.0です。また、私の場合、aでラップすると、float()読みにくくなる場合があります。

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