【问题标题】:Using integer division in Python在 Python 中使用整数除法
【发布时间】:2014-02-14 00:04:11
【问题描述】:

考虑一下这个 Python 部门:

基数 = 12.0

身高 = 16

面积 = 1/2 * 底 * 高

解决方案说明了这一点

面积=(底*高)/2;

让我感到困惑的是 1/2 将是浮点数,而 Python 只会显示 0,而不是 0.5。为什么在这种情况下解决方案使用 /2?

【问题讨论】:

  • 使用1//2进行整数除法
  • @BradAllred 我相信他想要浮点除法,而不是整数除法
  • 大概适用于 Python 2?

标签: python


【解决方案1】:

Python 2.7 自动使用/ 运算符作为整数(整数)除法,这将始终产生整数。

例如:

1/2 = 0

3/4 = 0

100/30 = 3

要进行浮点除法,必须将其中一个或两个值作为浮点类型。

像这样:

Area = 1.0/2 * Base * Height # 1.0 is a float type, 1 is an integer type

结果不是您所期望的,因为 Python 使用整数除法和运算顺序来计算表达式。

如果您在 Python 中计算 16 * 12 / 2,Python 会将其解释为 (16 * 12) / 2192 / 2 = 96

如果您评估 1/2 * 16 * 12,Python 会将其解释为 (((1/2) * 16) * 12) = (0 * 16) * 12

更多示例:

Area = Base * Height * (1.0/2.0)

Python 这次评估 (1.0/2.0) first,因为运算顺序决定了括号首先被评估。由于 1.0 和 2.0 是浮点数而不是整数,Python 可以很好地执行浮点除法。你得到这个:

Base * Height * (0.5)
= 192 * 0.5
= 96

,它可以满足您的期望。

相比之下:

Base * Height * (1/2)
= Base * Height * (0) # since 1/2 rounds down to 0 in integer division
= 192 * 0
= 0

Carpetsmoker 的替代解决方案:

from __future__ import division

这一行将为您提供 Python 2.x 程序中的 Python 3.x 行为,并且 Python 3.x 接受 / 运算符作为浮点除法,即使两个值都是整数类型。因此,在你导入这个之后,/ 成为浮点除法运算符。

>>> from __future__ import division
>>> 1/2
0.5

【讨论】:

  • 在 Python 3 中,这发生了变化,你得到了一个浮点数(0.5),正如你所期望的那样。在 Python 2 中,您可以在脚本顶部添加 from __future__ import division 以获取 Python 3 的行为。
  • 好的,你能告诉我怎么来 (base * height)/2 = (base * height) * (1.0/2.0) 右边等于左边
  • 为@Carpetsmoker 的信息添加并添加了额外的示例
  • 如果你做 1/2 * 16 * 12,Python 会将其计算为 (((1/2) * 16) * 12) = (0 * 16) * 12 我理解这一点,但我可以不明白为什么在解决方案区域 = (base * height)/2;我们有这个?我的意思是/2
  • @Serenity 这两个表达式只有在以下情况下才相等: 1) base height 是浮点数,或 2) base * height偶数。如果 baseheight 都是 3,则它们的乘积将为 9,并且 9/2 = 4。
【解决方案2】:

整数除法是简单地丢弃超过一个位置的余数。将 7 除以 3 将得到 3 堆 2,剩下一个,因此:

7 / 3 = 2

Python 有两种常用的数字类型:整数,只能表示整数,浮点数,可以表示十进制数。传统上,在许多编程语言(C、Java 等)中,对两个相同类型的对象执行基本操作(例如 +-*/)会给您另一个对象那种。如果它们不同,则其中一个对象将安全地typecast 转换为更通用的形式。这通常会导致无法表示分数的整数被强制转换为可以表示的浮点数。然后将两个浮点数分开,产生另一个浮点数。

因此,在 Python 2 中,当您将运算符 / 与两个整数一起使用时,结果将是一个整数。 1/20.5,但小数部分被丢弃,所以你只剩下 0

但是,在 Python 3 中,/was modified 始终转换为浮点数,从而导致真正的除法。 1/2 = 0.52/1 = 2.0。对于新程序员来说,这是“预期的”行为,并且可以为现有程序员生成更清晰的代码。通过在脚本顶部添加future import,可以在 Python 2 中模拟这种新行为:

from __future__ import division

如果您确实想要在 Python 2.5+ 或 3.x 中截断除法,则可以使用新的 // 运算符来模拟旧的 /

【讨论】:

  • 感谢您扩展有关 Python 不同版本的信息。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多