Python3.4 四舍五入到最近的偶数(在平局情况下)。
>>> round(1.5)
2
>>> round(2.5)
2
但只有在四舍五入到整数时,它才似乎这样做。
>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9
在上面的最后一个例子中,当四舍五入到最接近的偶数时,我本来期望得到2.8作为答案。为什么这两种行为之间会有差异呢?
Python3.4 四舍五入到最近的偶数(在平局情况下)。
>>> round(1.5)
2
>>> round(2.5)
2
但只有在四舍五入到整数时,它才似乎这样做。
>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9
在上面的最后一个例子中,当四舍五入到最接近的偶数时,我本来期望得到2.8作为答案。浮点数只是近似值;2.85 无法被精确表示:
>>> format(2.85, '.53f')
'2.85000000000000008881784197001252323389053344726562500'
这个数略大于2.85。
0.5和0.75可以用二进制小数精确表示(分别为1/2和1/2+1/4)。
round()
函数明确记录了这一点:
注意:对浮点数进行四舍五入的行为可能令人惊讶:例如,
round(2.675, 2)
返回2.67
而不是期望的2.68
。这并非错误,而是因为大多数十进制小数不能完全精确地表示为浮点数。有关更多信息,请参见浮点运算:问题与限制。
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
n
,它似乎只返回 n - n % 2
。 - Mark Dickinsonround()
之后做的任何操作都是不必要的。 - Andreas Magnussonround(2.6) == 3
,它只在平局时向最接近的偶数四舍五入。 - rsalmei回答标题... 如果您使用 int(n)
,它将朝零截断。如果结果是奇数,则加一:
n = 2.7 # your whatever float
result = int(n)
if (result & 1):
result += 1
更新:是的,这里存在一个负数的错误。还有一个关于已经有整数值的数字的bug。留作作业给你 :)
& 1
而不是 % 2
来检查一个数字是否为偶数... 没有周围的上下文,我甚至不确定那是你在做什么。我会认为你正在进行某种标志比较或其他操作。 - ArtOfWarfare(result & 1)
获取最低位。如果它被设置为一,则该值为奇数。 - pepr