Python3 四舍五入到最接近的偶数

21 投票
3 回答
8564 浏览
提问于 2025-04-18 03:57

Python3.4在处理四舍五入的时候,会选择最接近的偶数(在遇到平局的情况下)。

>>> round(1.5)
2
>>> round(2.5)
2

不过,这种情况似乎只发生在四舍五入到整数的时候。

>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9

在上面的最后一个例子中,我本来期待四舍五入到最接近的偶数时,结果是2.8。

为什么这两种行为之间会有差异呢?

3 个回答

0

关于标题的问题... 如果你使用 int(n),它会向零方向截断。如果结果是奇数,那么你需要加一:

n = 2.7     # your whatever float
result = int(n)
if (result & 1):     
    result += 1

更新:是的,负数会有一个错误。而且对于已经是整数的数字也会有问题。这个就留给你自己去研究了。:)

1

Martijn说得非常对。如果你想要一个整数四舍五入的方法,让它总是四舍五入到最近的偶数,那么我推荐使用这个:

def myRound(n):
    answer = round(n)
    if not answer%2:
        return answer
    if abs(answer+1-n) < abs(answer-1-n):
        return answer + 1
    else:
        return answer - 1
33

浮点数其实只是一个个近似值;比如说,2.85并不能被准确地表示出来:

>>> format(2.85, '.53f')
'2.85000000000000008881784197001252323389053344726562500'

它实际上稍微大于2.85。

像0.5和0.75这样的数可以用二进制分数准确表示(分别是1/2和1/2 + 1/4)。

round()这个函数在文档中明确说明了这一点:

注意:对于浮点数,round()的表现可能会让人感到意外:比如,round(2.675, 2)的结果是2.67,而不是大家预期的2.68。这并不是一个错误,而是因为大多数小数在浮点数中无法被准确表示。想了解更多信息,可以查看浮点运算:问题和局限性

撰写回答