2017-08-01 7 views
4
2 + 2/- 7 * - 7 * 8 - 5 + 7 * -3 

異なっているPythonのは、このように、この式を計算なぜRubyとPythonの数学の計算が

2+2/-7*-7*8-5+7*-3 == 32 
# => true 

しかし正解は-8です。

どこが間違っていますか? Rubyの結果とPythonの結果が異なるのはなぜですか?パイソン

>>> 2+2/-7*-7*8-5+7*-3 == -8.0 
True 

+8

Python 2.xでは32、Python 3.xでは-8が得られます。違いは '/'が整数除算を行うかどうかです。 (Python 3.xがこれを変更しました) – smarx

答えて

9

/点分割フローティングないからです。

しかし、Ruby /は整数除算を意味します。

PythonをRubyのように動作させるには、//を使用する必要があります。

それを破壊:ルビー(と古いPythonの、すなわち、Pythonの2)で基本的にはRubyで

2+2/-7*-7*8-5+7*-3 
    = 2 + 2/(-7) * (-7) * 8 - 5 + 7 * (-3) 
    = 2 + 2/(-7) * (-7) * 8 - 5 + 7 * (-3) 
    = 2 + (-0.2857142857142857) * (-7) * 8 - 5 + 7 * (-3) 
    = 2 + 2.0 * 8 - 5 + 7 * (-3) 
    = 2 + 16.0 - 5 + 7 * (-3) 
    = 2 + 16.0 - 5 + 7 * (-3) 
    = 2 + 16.0 - 5 + (-21) 
    = -8.0 

2+2/-7*-7*8-5+7*-3 
    = 2 + 2/(-7) * (-7) * 8 - 5 + 7 * (-3) 
    = 2 + (-1) * (-7) * 8 - 5 + 7 * (-3) 
    = 2 + 7 * 8 - 5 + 7 * (-3) 
    = 2 + 56 - 5 + 7 * (-3) 
    = 58 - 5 + (7 * -3) 
    = 53 + (7 * -3) 
    = 53 + (-21) 
    = 32 

:Pythonで

2/(-7) == -1 

Pythonでは(つまり、 以来の周りされているのPython 3は、):

2/(-7) == -0.2857142857142857 
2 // (-7) == -1 

としては指摘し、正しくので、コメントの中で、Pythonの古いバージョンがある人々は今日でも使用することを(Pythonの2と呼ばれます! )/はRubyのように動作します。

多くの人々がPython 2が死ぬのを待っていますが、それは掛かっています(それでもうまくいく)ので、Python 2とPython 3を修飾するのが最善です。 OPは完全な世界では、我々がすべて言うことができるだろう、Python 3に適用するために、非修飾語 "Python"を使用しています。結局のところ、誰もPython "1"を使用していますか? :-)

+0

/の動作がPython 2からPython 3に変更されました。その答えが普遍的に正しいわけではありません。 –

+0

あなたは正しいです。私がPython 2が存在しないふりをしようとする限り、それは実際に行い、真実と現実は私の夢よりも優先すべきです。 :) –

+0

"ほとんどの人がPython 2が死ぬのを待っています"。この主張の最近の情報源はありますか?私が最後に見たときには、Python3よりもPython2のユーザーがまだ多かったです。 –

12

この例は単純である:Rubyで

(とPython 2.xの)、1/2 == 0。 Python 3.xでは、それは0.5です。

RubyとPython 2では、2つの整数間の/が整数除算を実行します(真の結果をフロアします)。

Rubyには-8があります。私はあなたの最初の質問にお答えします

2+2.0/-7*-7*8-5+7*-3 
+1

私はそれを切り捨てるのではなく、Pythonで知っています。私はRubyに慣れていませんが、Rubyも同様にフロアリングしているようです。それは、私が気付いていないことは私の実験を混乱させることです。 (私は関連するRubyのドキュメントを見つけることができませんでした) – user2357112

+0

あなたはそうです、ありがとう!今編集中。 – smarx

+0

@ user2357112:そうです、対応する[doc](https://ruby-doc.org/core-2.4.0/Integer.html#method-i-2F)は役に立たないです。 Rubyの整数部はフローリングを使用します。 –

0

:浮動小数点値という作り、2.0に注意してください。

あなたのPythonとRubyのレポートが正しいとすれば、明らかに、「どこが間違っていますか?」という質問に対する答えは1つだけです。つまり、

しかし、正解は-8です。

自分で確認してきたように、あなたのPython環境の正しい答えは-8.0あり、そして、あなたのRubyの環境のために、それは32です。

関連する問題