Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇3四舍五入至最接近的偶数_Python_Python 3.x_Floating Point_Rounding - Fatal编程技术网

Python 蟒蛇3四舍五入至最接近的偶数

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

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()
函数:

注意:浮动的
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