为什么Ruby和Python的数学计算结果不同?

4
2 + 2 / - 7 * - 7 * 8 - 5 + 7 * -3

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的不同?


8
Python 2.x 会给你答案 32,而 Python 3.x 会给你答案 -8。区别在于 / 是否进行整数除法,这是 Python 3.x 改变的。 - user94559
3个回答

12

这个例子更简单:

在 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

1
我知道在Python中是向下取整,而不是截断。我不熟悉Ruby,但似乎Ruby也是向下取整 - 或者是我不知道的其他事情使我的实验受到干扰。(我找不到任何相关的Ruby文档。) - user2357112
@user2357112:你说得对,相应的文档是无用的。Ruby整数除法使用向下取整。 - Eric Duminil

9
在Python中,
>>> 2+2/-7*-7*8-5+7*-3 == -8.0
True

因为 / 运算符在Python中实现的是浮点数除法。

但是,在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

基本上在 Ruby 中(以及旧版本的 Python,即 Python 2):
2 / (-7)   ==  -1

在Python中(即Python 3,自2008年以来一直存在):
2 / (-7)   ==  -0.2857142857142857
2 // (-7)  ==  -1

正如评论中正确指出的那样,有一个名为Python 2的旧版本仍在使用(至今仍在使用!),其中/的工作方式类似于Ruby。
虽然许多人都在等待Python 2的消亡,但它仍在继续(并且仍然表现良好),因此最好将Python 2与Python 3区分开来。从问题中可以清楚地看出,O.P.使用了未经修饰的术语“Python”来表示Python 3,在完美的世界中,我们都可以这样说。毕竟,还有人在使用Python“1”吗? :-)

Python 2 到 Python 3 的行为发生了变化,因此你的答案并不普遍正确。 - Christian König
你说得对。尽管我试图假装Python 2不存在,但它实际上确实存在,事实和现实应该优先于我的梦想。 :) - Ray Toal
大多数人都在等待Python 2的消亡。这个说法有最近的来源吗?上次我查看时,Python2的用户仍然比Python3多。 - Eric Duminil
言过其实了。但你的观点很有道理,我会改成“许多”。 - Ray Toal

0

我会回答你的第一个问题。

假设你的Python和Ruby报告是正确的,显然,只有一个地方剩下来作为你问题的答案:“我错在哪里?”也就是说,

但正确的答案是-8。

正如你自己确认的那样,你的Python环境的正确答案是-8.0,而你的Ruby环境的正确答案是32


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接