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的不同?
这个例子更简单:
在 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
>>> 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
2 / (-7) == -1
2 / (-7) == -0.2857142857142857
2 // (-7) == -1
/
的工作方式类似于Ruby。我会回答你的第一个问题。
假设你的Python和Ruby报告是正确的,显然,只有一个地方剩下来作为你问题的答案:“我错在哪里?”也就是说,
但正确的答案是-8。
正如你自己确认的那样,你的Python环境的正确答案是-8.0
,而你的Ruby环境的正确答案是32
。
/
是否进行整数除法,这是 Python 3.x 改变的。 - user94559