考虑这个 Python 划分:
基数 = 12.0
高度 = 16
面积 = 1/2 * 底 * 高
解决方案显示了这个
面积=(底*高)/2;
令我困惑的是,1/2 是浮点数,而 Python 将只显示 0,而不是 0.5。为什么在这种情况下解决方案使用 /2?
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
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 中进行截断除法,可以使用新的
//
运算符来模拟旧的
/
。