将 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] 中的 round
、math.floor
和 math.ceil
函数之间的实际区别是什么=]?
快速回答示例
区别在于它们截断和舍入输入的方式。
round
舍入到最接近的整数(通过选择偶数打破平局),math.floor
舍入到 -inf
,math.ceil
舍入到 +inf
。
还值得注意的是 round(x,0)
return 是 float
而 round(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)
如何产生 -1
而 math.floor(-1.4)
产生 -2
.
还要注意 round(2.5)
如何产生 2
而 round(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.floor
和 math.ceil
另一方面,math.floor
和 math.ceil
分别显式取小于和大于输入值的最接近整数。这就是为什么说它们“朝向 -/+ inf”四舍五入的原因。
举个例子:-1.4
。在这种情况下,小于或等于输入的最接近整数(即最接近 -inf
)是 -2。这就是 math.floor(-1.4)
产生 -2.0
的原因。同样,大于或等于输入(即最接近 +inf
)的最接近整数是 -1,这就是为什么 math.ceil(-1.4)
产生 -1
.
文档的链接
(感谢 @MarkDickinson 指出了我原来回答中的一些错误!)
当尝试将小数点值(浮点数)舍入为整数时,[=17] 中的 round
、math.floor
和 math.ceil
函数之间的实际区别是什么=]?
快速回答示例
区别在于它们截断和舍入输入的方式。
round
舍入到最接近的整数(通过选择偶数打破平局),math.floor
舍入到 -inf
,math.ceil
舍入到 +inf
。
还值得注意的是 round(x,0)
return 是 float
而 round(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)
如何产生 -1
而 math.floor(-1.4)
产生 -2
.
还要注意 round(2.5)
如何产生 2
而 round(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.floor
和 math.ceil
另一方面,math.floor
和 math.ceil
分别显式取小于和大于输入值的最接近整数。这就是为什么说它们“朝向 -/+ inf”四舍五入的原因。
举个例子:-1.4
。在这种情况下,小于或等于输入的最接近整数(即最接近 -inf
)是 -2。这就是 math.floor(-1.4)
产生 -2.0
的原因。同样,大于或等于输入(即最接近 +inf
)的最接近整数是 -1,这就是为什么 math.ceil(-1.4)
产生 -1
.
(感谢 @MarkDickinson 指出了我原来回答中的一些错误!)