我已经玩了一段时间Python,我注意到一个奇怪的行为让我很好奇:
float(int(n))
和round(n)
之间有什么区别?
我什么时候应该使用其中一种、另一种或都不使用?
注意:Python 实现在 2.7 和 3.x 之间发生了变化。我相应地更正了答案。
为了完整起见,让我在您的问题中添加两个函数,并解释
float(int(x))
、math.floor(x)
、round(x)
和 math.ceil(x)
之间的区别。
让我们从一个问题开始:“什么整数最能代表数字 1.6?” 我们有两个可能的答案(1 和 2),但其中一个答案可能比另一个更好的原因有很多不同:
int(1.6)==1
:这就是去掉小数后得到的结果。math.floor(1.6)==1
:小于2件,不完整的件不算。round(1.6)==2
:因为2比1更接近。math.ceil(1.6)==2
: 超过1。当你开始一部分时,你必须支付全价。让 python 打印一个漂亮的表格,其中包含不同 x 值得到的结果:
from math import floor, ceil
tab='\t'
print('x \tint\tfloor\tround\tceil')
for x in (
1.0, 1.1, 1.5, 1.9, -1.1, -1.5, -1.9,
-2.5, -1.5, -0.5, 0.5, 1.5, 2.5,
):
print(x, tab, int(x), tab, floor(x), tab, round(x), tab, ceil(x))
这是输出:
x int floor round ceil
1.0 1 1 1 1
1.1 1 1 1 2
1.5 1 1 2 2
1.9 1 1 2 2
-1.1 -1 -2 -1 -1
-1.5 -1 -2 -2 -1
-1.9 -1 -2 -2 -1
-2.5 -2 -3 -2 -2
-1.5 -1 -2 -2 -1
-0.5 0 -1 0 0
0.5 0 0 0 1
1.5 1 1 2 2
2.5 2 2 2 3
您会看到这四个函数都不等效。
floor
向负无穷大舍入:它始终选择可能的最低答案:floor(1.99)==1
和floor(-1.01)==-2
。ceil
向无穷大舍入:它始终选择可能的最高答案:ceil(1.01)==2
和 ceil(-1.99)=-1
。int
朝零舍入:对于正数x
,它就像floor
,对于负数x
,它就像ceil
。round
舍入到最接近的可能解决方案:round(1.49)=1
和round(1.51)==2
。当 x
严格位于两个数字之间时,round(x)
将是最接近的 偶数 数。这称为半到偶数舍入或银行家舍入,因为它常用于金融计算。注意: Python 实现在 2.7 和 3.x 之间发生更改:Python 2.7 不使用“半到偶数舍入”规则(如上所述),而是将所有半数舍入到远离零的位置:
round(1.5)==2
和round(-1.5)==-2
。关心这一点的银行家和数学家一致认为 3.x 中使用的“半舍入到偶数舍入”规则是“正确的方法”,因为它公平地分配舍入误差。
round(n)
是一个对浮点数进行四舍五入的函数,int(n)
会将浮点数转换为整数,并通过截断来去掉小数部分。
round
是数学舍入,int
只是转换为整数,本质上是截断值。
取2个变量:
var1 = 5.5
var2 = 5.1
如果我们把它们围起来
round(var1)
round(var2)
我们分别得到 6.0 和 5.0。
但是,如果我们只是将它们转换为 int
int(var1)
int(var2)
我们两人都得到 5 分。
您可以在 python 解释器中自己测试一下。