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不同?
答案 0 :(得分: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 :(得分:9)
在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
基本上在Ruby(和旧的Python,即Python 2)中:
2 / (-7) == -1
在Python中(即Python 3,已经在SINCE 2008 ):
2 / (-7) == -0.2857142857142857
2 // (-7) == -1
正如所指出的那样,正确地说,在评论中,有一个旧版本的Python叫做Python 2(人们今天仍在使用!),/
就像在Ruby中一样。
虽然许多人都在等待Python 2死亡,但它仍然存在(并且仍然很好),所以,是的,最好是对Python 2和Python 3进行限定。从问题中可以清楚地看出OP正在使用不合格的术语" Python"适用于Python 3,它在一个完美的世界中,将是我们都可以说的。毕竟,有没有人使用Python" 1"? : - )
答案 2 :(得分:0)
我会回答你的第一个问题。
假设您的Python和Ruby报告是正确的,显然,只有一个地方可以作为您问题的答案:"我错在哪里?"。也就是说,
但正确答案是-8。
正如您已经确认的那样,您的Python环境的正确答案是-8.0
,而对于您的Ruby环境,它是32
。