将 decimal/float 舍入为整数时,在 python 中使用 round、floor 或 ceil 有什么区别?

When rounding a decimal/float to an integer, what's the difference between using round, floor or ceil in python?

当尝试将小数点值(浮点数)舍入为整数时,[=17] 中的 roundmath.floormath.ceil 函数之间的实际区别是什么=]?

快速回答示例

区别在于它们截断和舍入输入的方式。

round 舍入到最接近的整数(通过选择偶数打破平局),math.floor 舍入到 -infmath.ceil 舍入到 +inf

还值得注意的是 round(x,0) return 是 floatround(x)floor(x)ceil(x) return 整数.

这里有几个例子:

Input (x) round(x) math.floor(x) math.ceil(x)
1.4 1 1 2
1.5 2 1 2
1.6 2 1 2
-1.4 -1 -2 -1
-1.5 -2 -2 -1
-1.6 -2 -2 -1
2.5 2 2 3
3.5 4 3 4
4.5 4 4 5
-2.5 -2 -3 -2
-3.5 -4 -4 -3
-4.5 -4 -5 -4

注意 round(-1.4) 如何产生 -1math.floor(-1.4) 产生 -2.

还要注意 round(2.5) 如何产生 2round(3.5) 产生 4.

更长的答案

round

更长的解释是当你使用round(x)round(x,0)时,Python使用了一个叫做round half to even的方法。该方法找到 最接近的整数 。如果较大和较小整数的距离相同,顾名思义,该算法会通过选择最接近的 even 数字来打破平局。这就是 round(2.5) 产生 2 的原因:因为 2.5 与 2 和 3 的距离相等,并且在有两个距离相等的选择的情况下,算法会选择偶数选择。

可以找到 Python 文档 here and here. This SO question 也值得一试。

math.floormath.ceil

另一方面,math.floormath.ceil 分别显式取小于和大于输入值的最接近整数。这就是为什么说它们“朝向 -/+ inf”四舍五入的原因。

举个例子:-1.4。在这种情况下,小于或等于输入的最接近整数(即最接近 -inf)是 -2。这就是 math.floor(-1.4) 产生 -2.0 的原因。同样,大于或等于输入(即最接近 +inf)的最接近整数是 -1,这就是为什么 math.ceil(-1.4) 产生 -1.

这里是 Python 的 floor and ceil

文档的链接

(感谢 @MarkDickinson 指出了我原来回答中的一些错误!)