2017-11-15 2 views
-7

Python 2とPython 3は、2つの量のパーセンテージの差を見つける非常に簡単な数学演算のために異なる答えに到達するようです。例えばPython2/3は、同じ数学演算に異なる答えを与えます...なぜですか? (%の差を計算する)

# Python 2.7.10 
>>> def percent_difference(qty1, qty2): 
...  diff = max(qty1, qty2) - min(qty1, qty2) 
...  print(diff) 
...  percent = diff/((qty1 + qty2)/2) 
...  print(percent) 
... 
>>> percent_difference(1, 2) 
1 
1 

# Python 3.6.2 

>>> def percent_difference(qty1, qty2): 
...  diff = max(qty1, qty2) - min(qty1, qty2) 
...  print(diff) 
...  percent = diff/((qty1 + qty2)/2) 
...  print(percent) 
... 
>>> percent_difference(1, 2) 
1 
0.6666666666666666 

はここで何が起こっているの?

(のpython3が正しいか)あなたが出力をフロートしたいというのPythonに伝える必要があり

答えて

0

。 Try percent_difference(1.0, 2.0)

1

/演算子の動作がPython 3によって変更されました。これは、使用された型に依存していました(つまり、integer/integerは、オペランドの1つが浮動小数点除算を得る浮動小数点の場合は整数除算です)。

変更の根拠は、Pythonの拡張提案PEP-0238で説明されています。

正しい仕事の周りに微妙である:それは複素数ことができれば)(フロート間違っているために、引数をキャスト。引数に0.0を追加すると、引数の符号がマイナス0の場合は保持されません。どちらの欠点もない唯一の解決策は、引数(通常は最初のもの)に1.0を掛けることです。これにより、floatとcomplexの値と符号は変更されず、intとlongは対応する値のfloatに変換されます。

0

Python2およびPython3は整数のdiv演算を別々に扱います。

python3でdivの操作は整数を扱うと同じに浮かぶます:python2

2/3 = 1.5 
2.0/3 = 1.5 
2/3.0 = 1.5 
2.0/3.0 = 1.5 

両方のオペランドが整数である場合、それは浮動小数点の後に番号を切り捨てます:

2/3 = 1 
2.0/3 = 1.5 
2/3.0 = 1.5 
2.0/3.0 = 1.5 
関連する問題