在Python中使用整数除法

问题描述 投票:0回答:2

考虑这个 Python 划分:

基数 = 12.0

高度 = 16

面积 = 1/2 * 底 * 高

解决方案显示了这个

面积=(底*高)/2;

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

python python-2.7
2个回答
3
投票

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) / 2
,或
192 / 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) ,因为运算顺序决定首先计算括号。由于 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
    

1
投票
整数除法是简单地丢弃超出该位置的余数。将 7 除成 3 将得到 3 堆 2,还剩下一堆,因此:

7 / 3 = 2

Python 有两种常用的数字类型:整数(只能表示整数)和浮点数(可以表示小数)。传统上,在许多编程语言(C、Java 等)中,对同一类型的两个对象执行基本操作(例如

+

-
*
/
)会得到另一个对象那种类型。如果它们不同,其中一个对象将被安全地 
typecast 转换为更通用的形式。这通常会导致无法表达分数的整数被转换为可以表达分数的浮点数。然后将两个浮点数分开,产生另一个浮点数。

因此,在 Python 2 中,当您将运算符

/

 与两个整数一起使用时,结果将是一个整数。 
1/2
0.5
,但小数部分被丢弃,所以只剩下 
0

但是,在 Python 3 中

/

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

from __future__ import division

如果您确实想要在 Python 2.5+ 或 3.x 中进行截断除法,可以使用新的

//

 运算符来模拟旧的 
/

© www.soinside.com 2019 - 2024. All rights reserved.