Python 为什么舍入0.5(十进制)不精确?

Python 为什么舍入0.5(十进制)不精确?,python,floating-point,rounding,floating-accuracy,Python,Floating Point,Rounding,Floating Accuracy,一半,即十进制的0.5,有一个精确的二进制表示:0.1 然而,如果我把它四舍五入为整数,我得到的是0而不是1。我尝试了Python和C,它们的行为相同。例如,python代码: >>> a,b,c = 0.49, 0.5, 0.51 >>> [round(x) for x in (a,b,c)] [0, 0, 1] >>> "%.0f %.0f %.0f" % (a,b,c) '0 0 1' 有趣的是 >>> a,b,c

一半,即十进制的0.5,有一个精确的二进制表示:0.1

然而,如果我把它四舍五入为整数,我得到的是0而不是1。我尝试了Python和C,它们的行为相同。例如,python代码:

>>> a,b,c = 0.49, 0.5, 0.51
>>> [round(x) for x in (a,b,c)]
[0, 0, 1]
>>> "%.0f %.0f %.0f" % (a,b,c)
'0 0 1'
有趣的是

>>> a,b,c = 0.049, 0.05, 0.051
>>> [round(x,1) for x in (a,b,c)]
[0.0, 0.1, 0.1]
>>> "%.1f %.1f %.1f" % (a,b,c)
'0.0 0.1 0.1'
我知道有许多类似的问题,例如,问题和义务问题

如果一个数字有精确的二进制表示,比如(十进制)0.5,那么它不应该被正确舍入吗


编辑:问题出现在3.4.3版中,但不是在2.7.6版中,我知道他们更改了python 3中的舍入方法

因此,根据v2.7.3:

In [85]: round(2.5)
Out[85]: 3.0

In [86]: round(3.5)
Out[86]: 4.0
在v3.2.3中:

In [32]: round(2.5)
Out[32]: 2

In [33]: round(3.5)
Out[33]: 4
我不知道这是否对你有帮助,但我把它作为答案贴出来,因为我的名声不好,所以我不能发表评论


这个问题在这里得到了更恰当的回答:

我没有得到这些结果-我看到了0、1、1。您使用的是什么版本的Python,在什么平台上使用?请注意,虽然
0.5
具有精确的二进制表示形式
0.05
Dos Not,但问题已经得到回答:@HelloWorld mark as duplicate抱歉,这并不能回答问题。回答得好。有关更多信息,请参阅。