2016-11-23 3 views
1

Pythonで普通の計算をすると、何か非常に奇妙なことが起こります。角括弧なしで乗算を行うと正しい結果が得られますが、いくつかの項目を角括弧に入れると合計乗算はゼロになります。信じない人のために要素を角かっこ(Python)に入れた場合の乗算は0になります

(私はそれは奇妙に聞こえることを知っている):

>>> print(1.1*1.15*0.8*171*15625*24*(60/368*0.75)/1000000) 
0.0 
>>> print(1.1*1.15*0.8*171*15625*24*60/368*0.75/1000000) 
7.93546875 

this Jupyter screenshotに示すように。

両方の乗算の唯一の違いは、最初は括弧が60/368*0.75であることです。

これはどのように可能なのですか、それに対して私は何ができますか?私はこれがどのように可能なのか全く分かりません。

+1

これは演算子の優先順位に関するもので、括弧を削除することで等式が等しくなることはありません。 – amin

+0

'*'と '/'は同じ優先順位を持ちますので、paranthesisを省略すると左から右に移動します。 – Felk

+0

しかし、両方の計算が等しい場合、どうすればそのような違いが得られますか?そんなことを防ぐ方法は?私は偶然それに気づいた – Koen

答えて

2

あなたがpythonで整数abを分割した場合、結果はa < bは、我々が得るためならば、分裂の床です:括弧付き floor(a,b)=0

をあなたは0を与える操作60/368を持っています。

しかし、括弧なしで数60が最初にそう368でこの値を割ることは0が得られていないいくつかのダブル値で、その結果、その前にすべてのものを掛けています。

+0

'を参照してください。[Pythonで整数a/bを除算すると、結果は、分割されたヘア分割の床です:* python 2 *では、*は* python 3 *では 'a // b'です。 – greybeard

2

括弧は評価の順序を変更し、最初に評価式を評価します。ここでは、60と368は両方とも整数リテラルであるため、integer divisionを使用して分割されているため、「全体」部分だけが保持されています。 60は368より小さいので、その整数除算は0です。その結果は明らかです。乗算器の1つが0であるため、結果は0になります。

これを防ぐには、数値を浮動小数点リテラル(60.0と368.0)で表すことができます。 (技術的には、ここでは60.0を使用するだけで十分ですが、一貫性のためにすべての数値を浮動小数点リテラルとして表すことをお勧めします)。

+0

可能であれば、 '/'は数学的に期待通りに動作し、整数除算はそれ自身の '//'演算子を持つPython 3に切り替えるのが、より良い解決策です。 – Felk

+0

@Felkはアプリケーション全体を新しいバージョンに移植します。あなたの数値リテラルに一貫した規約を使用するのではなく、数多くの微妙な相違点があります。個人的には、私はしません。 – Mureinik

+0

あなたの明確な説明をありがとう! – Koen

関連する問題