2 + 2/- 7 * - 7 * 8 - 5 + 7 * -3
的Python計算這個表達式是這樣的:爲什麼Ruby和Python的數學計算是不同的
2+2/-7*-7*8-5+7*-3 == -8.0
# True
和Ruby這樣的:
2+2/-7*-7*8-5+7*-3 == 32
# => true
但正確答案是-8
。
我在哪裏錯了?爲什麼Ruby的結果與Python不一樣?
2 + 2/- 7 * - 7 * 8 - 5 + 7 * -3
的Python計算這個表達式是這樣的:爲什麼Ruby和Python的數學計算是不同的
2+2/-7*-7*8-5+7*-3 == -8.0
# True
和Ruby這樣的:
2+2/-7*-7*8-5+7*-3 == 32
# => true
但正確答案是-8
。
我在哪裏錯了?爲什麼Ruby的結果與Python不一樣?
在Python
>>> 2+2/-7*-7*8-5+7*-3 == -8.0
True
因爲/
沒有浮點除法。
但在Ruby中/
表示整數除法。
要使Python像Ruby一樣工作,您需要使用//
。
其分解:
在Python:
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
在Ruby,
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,即Python 2中):
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」來應用於Python 3,而在完美的世界中,這將是我們所能說的。畢竟,有人使用Python「1」嗎? :-)
/從Python 2改爲Python 3的行爲,所以你的答案並不是普遍正確的。 –
你是對的。儘管我試圖假裝Python 2不存在,但它確實存在,真相與現實應該優先於我的夢想。 :) –
「大多數人都在等待Python 2死亡」。這種說法有沒有最近的來源?上次我看,Python2的用戶比Python3更多。 –
這個例子是簡單的:
在Ruby(和Python 2.X),1/2 == 0
。在Python 3.x中,它是0.5
。
發生什麼事是在Ruby和Python 2中,/
之間的兩個整數執行整數除法(分層結果爲真)。
以下將給你在Ruby中的-8
。注意2.0
,使得浮點值:
2+2.0/-7*-7*8-5+7*-3
我知道它在Python中的樓層,而不是截斷。我對Ruby不熟悉,但Ruby似乎也是地板 - 或者我不知道的其他東西是混淆我的實驗。 (我找不到任何相關的Ruby文檔。) – user2357112
你說得對,謝謝!現在編輯。 – smarx
@ user2357112:你說得對,相應的[doc](https://ruby-doc.org/core-2.4.0/Integer.html#method-i-2F)沒用。 Ruby整數部門使用地板,是的。 –
我會回答你的第一個問題。
假設你的Python和Ruby報告是正確的,顯然,只有一個地方留下來回答你的問題:「我錯在哪裏?」。也就是,
但是正確答案是-8。
正如你已經確認你自己,你的Python環境的正確答案是-8.0
,併爲你的Ruby環境中,它是32
。
Python 2.x會給你32,Python 3.x會給你-8。區別在於'/'是否是整數除法。 (Python 3.x改變了這一點。) – smarx