【问题标题】:multiplication gives zero if I put elements into brackets (python)如果我将元素放入括号中,乘法为零(python)
【发布时间】:2016-11-23 07:02:55
【问题描述】:

如果我在 Python 中进行一些普通的计算,就会发生一些非常奇怪的事情。如果我在没有括号的情况下进行乘法,它会给出正确的结果,但是如果将一些东西放入括号中,则总乘法将等于零。

对于那些不相信的人(我知道这听起来很奇怪):

>>> 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

this Jupyter screenshot所示。

这两个乘法的唯一区别是,第一个乘法在60/368*0.75 周围有括号。

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

【问题讨论】:

  • 这是关于运算符优先级的,通过消除括号,方程将不相等。
  • */ 具有相同的优先级,因此省略括号只会从左到右。
  • 但是两个计算是相等的,它怎么会给出这样的差异呢?以及如何防止此类事情发生?我无意中注意到了它
  • 他们不相等。 24*60/36824*(60/368) 不同。请注意,/ 在 Python 2 中是一个截断除法
  • @Felk 你所说的“不一样”是什么意思,我的意思是从数学的角度来看它们应该是相等的

标签: python division multiplication


【解决方案1】:

如果你在 python 中将整数 a,b 相除,则结果是除法的下限,因此如果 a < b 我们得到:

使用括号你有操作60/368,它给出0

但如果没有括号,数字 60 首先会乘以它之前的所有值,这会产生一些 double 值,因此将该值除以 368 不会得到 0

【讨论】:

  • [dividing integers a/b in python, the result is the floor of the division hair split: 在python 2中,或a//bpython 3中。
【解决方案2】:

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

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

【讨论】:

  • 如果可能的话,更好的解决方案 imo 是切换到 Python 3,其中 / 的行为符合数学预期,而整数除法有它自己的 // 运算符
  • @Felk 将整个应用程序移植到该语言的较新版本中,其中有几十个细微的差异,而不是仅仅为您的数字文字使用一致的约定?就个人而言,我不会。
  • 这就是我说“如果可能”的原因。我不知道 OP 是在大型 Python 2 代码库上工作还是从头开始编写代码。其他有同样问题的人也许可以从 Python 3 开始
  • 你也可以在py2中from __future__ import division获取py3的行为。
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 2014-06-23
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多