我一直在玩 python 一段时间,我注意到一个奇怪的行为让我很好奇: float(int(n))
和 round(n)
之间有什么区别?
我什么时候应该使用一个、另一个或两者都不用?
原文由 Liam 发布,翻译遵循 CC BY-SA 4.0 许可协议
我一直在玩 python 一段时间,我注意到一个奇怪的行为让我很好奇: float(int(n))
和 round(n)
之间有什么区别?
我什么时候应该使用一个、另一个或两者都不用?
原文由 Liam 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答888 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
注意:python 实现在 2.7 和 3.x 之间发生了 变化。我相应地更正了答案。
For the sake of completeness, let me add two more functions to your question and explain the differences between
float(int(x))
,math.floor(x)
,round(x)
andmath.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个,入手一个part的时候要全价。让我们让 python 打印一个漂亮的表格,其中包含您使用不同的 x 值获得的结果:
这是输出:
您会看到这四个函数中没有一个是相等的。
floor
向负无穷大舍入:它总是选择可能的最低答案:floor(1.99)==1
和floor(-1.01)==-2
。ceil
向无穷大舍入:它总是选择最高可能的答案:ceil(1.01)==2
和ceil(-1.99)=-1
。int
rounds towards zero: For positivex
it is likefloor
, for negativex
it is likeceil
.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 中使用的“一半到偶数舍入”规则是这样做的“正确方法”,因为它公平地分配了舍入误差。