Python 蟒蛇3四舍五入至最接近的偶数
Python3.4循环至最近的偶数(在断开连接的情况下) 但它似乎只在四舍五入到整数时才这样做Python 蟒蛇3四舍五入至最接近的偶数,python,python-3.x,floating-point,rounding,Python,Python 3.x,Floating Point,Rounding,Python3.4循环至最近的偶数(在断开连接的情况下) 但它似乎只在四舍五入到整数时才这样做 >>> round(2.75, 1) 2.8 >>> round(2.85, 1) 2.9 在上面的最后一个例子中,当四舍五入到最接近的偶数时,我希望答案是2.8 为什么这两种行为之间存在差异?浮点数只是近似值;2.85无法准确表示: 略高于2.85 0.5和0.75可以用二元分数(分别为1/2和1/2+1/4)精确表示 round()函数: 注意:浮动的roun
>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9
在上面的最后一个例子中,当四舍五入到最接近的偶数时,我希望答案是2.8
为什么这两种行为之间存在差异?浮点数只是近似值;2.85无法准确表示: 略高于2.85 0.5和0.75可以用二元分数(分别为1/2和1/2+1/4)精确表示
round()
函数:
注意:浮动的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
def myRound(n):
答案=四舍五入(n)
如果没有回答%2:
回覆
如果abs(答案+1-n)
要回答标题。。。如果使用int(n)
,它将向零截断。如果结果为奇数,则添加一个:
n = 2.7 # your whatever float
result = int(n)
if (result & 1):
result += 1
更新:是的,负数存在错误。对于已经有整数值的数字也有一个bug。你的家庭作业。:) 啊-因此,第二轮(2.25,1)确实如预期的那样下降到了2.2。这里有一个有用的工具,详细解释了浮点数是如何存储的。这有太多的重复,几乎让人受伤。@AirThomas,这是那轮中特定于python3的()在python3 AFAIK中,只开始四舍五入到最接近的偶数。@AlexCouper:偶数四舍五入也许改变了你对会发生什么的预期,但你预期的和观察到的差异仍然可以用所有这些重复项来解释。@user3477950抱歉-在撰写本文时,我找不到任何,但是在你的评论之后,我发现如果你的问题仅仅是“为什么在3.x中会发生这种情况?”现有的答案回答了这个问题,但是如果你真的想知道“在Python3.x中如何获得预期的四舍五入?”,那么答案是“使用”这段代码的意图是什么?对于整数输入
n
,它似乎只返回n-n%2
@MarkDickinson:对于int
输入,它就是这样做的。然而,对于浮点输入,它将四舍五入到最近的偶数int@inspectorG4dget但是Python的回合已经接近了平局。。因此,您在round()
之后所做的一切都是不必要的……不,@AndreasMagnusson,round(2.6)==3
,它甚至只在平局时才进行轮换。@rsalmei:我认为这不是OP想要的。(顺便说一句,这对负数不起作用:-1.5将“四舍五入”为0。)我从未见过有人用&1
而不是%2
来检查一个数字是否在。。。如果没有周围的环境,我甚至不确定我是否会意识到你在做什么。我想你是在做某种标志比较之类的事情。@MarkDickinson:谢谢你指出这个bug;)你是对的,亚历克斯的脑子里有一些不同的想法。@ArtOfWarfare:我相信掩蔽比特在技术上比计算模要简单(因此速度更快)。在检查整数的奇数/偶数时,这是很常见的。由于Python中没有odd
函数,因此这两个函数在功能上是等价的。无论如何,在这两种情况下,我都会对真正的代码做一个简短的注释;)@很好,但你犯了个错误。您正确地编写了“如果结果不是偶数”,但实现了“如果不是(结果&1)”,即“如果结果不是奇数”。只要去掉“not”,你就有了一个很好的“轮到最近的偶数”函数。
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 = 2.7 # your whatever float
result = int(n)
if (result & 1):
result += 1