2016-11-23 64 views
1

如果我在Python中进行一些普通的计算,会发生一些非常奇怪的事情。如果我没有使用括号进行乘法运算,它会给出正确的结果,但是如果将一些内容设置为括号,则总乘法运算等于零。如果我把元素放进括号中,乘法运算会给出零(python)

对于那些谁不相信(我知道这听起来很奇怪):如图this Jupyter screenshot

>>> print(1.1*1.15*0.8*171*15625*24*(60/368*0.75)/1000000) 
0.0 
>>> print(1.1*1.15*0.8*171*15625*24*60/368*0.75/1000000) 
7.93546875 

两次乘法的唯一区别在于第一次有大括号60/368*0.75

这怎么可能,我能做些什么呢?我不知道这怎么可能。

+1

它是关于操作员的优先级,通过消除括号,方程将不相等。 – amin

+0

'*'和'/'具有相同的优先级,因此省略参数将从左到右。 – Felk

+0

但两个计算是相等的,它怎么会产生这样的差异?以及如何防止这种事情?我意外地注意到它 – Koen

回答

2

如果分割整数ab在蟒蛇的结果是分裂的地板上,因此如果a < b我们得到: floor(a,b)=0

用括号你有这给0操作60/368

但是,如果没有括号内的数字60首先由之前的一切,这会导致一些值,该值除以由368不会产生0相乘。

+0

'[在python中除去整数a/b,结果是分区的头发分割:*在python 2 *中,或* python 3 *中的'a // b'。 – greybeard

2

括号改变评估顺序,并首先评估它们内部的表达式。这里,由于60和368都是整数文字,因此它们使用integer division进行划分 - 意味着只保留“整个”部分。由于60小于368,因此它们的整数除法为0.从那里开始,结果很明显 - 您有一系列乘法和除法,其中一个乘法器为0,因此最终结果也将为0.

为了防止出现这种情况,您可以将数字表示为浮点文字 - 60.0和368.0。 (从技术上讲,在这里只使用60.0就足够了,但为了一致性,我建议将所有数字都表示为浮点文字)。

+0

如果可能,更好的解决方案是如果可能的话,切换到Python 3,其中'/'表现为数学预期,而整数除了它自己的'//'操作符而不是 – Felk

+0

@Felk将整个应用程序移植到更新版本的语言,在整个演出中有几十个微妙的差异,而不是仅仅为数字文字使用一致的约定?就我个人而言,我不会。 – Mureinik

+0

谢谢您的明确解释! – Koen