为什么舍入 0.5(十进制)不精确?
Why is rounding 0.5 (decimal) not exact?
一半,即十进制的 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'
我知道许多类似的问题,例如Python rounding error with float numbers, the Python tutorial on floating point arithmetics, and the obligatory What Every Computer Scientist Should Know About Floating-Point Arithmetic.
如果一个数字有精确的二进制表示,例如(十进制)0.5,它不应该正确舍入吗?
编辑:问题出现在版本 3.4.3,但版本 2.7.6 没有
我知道他们在 python 3.
中更改了 round 方法
因此,在 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
我不知道它是否对您有帮助,但我将其作为答案发布,因为我的声誉很低,无法发表评论。
问题在这里得到了更恰当的回答:Python 3.x rounding behavior
一半,即十进制的 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'
我知道许多类似的问题,例如Python rounding error with float numbers, the Python tutorial on floating point arithmetics, and the obligatory What Every Computer Scientist Should Know About Floating-Point Arithmetic.
如果一个数字有精确的二进制表示,例如(十进制)0.5,它不应该正确舍入吗?
编辑:问题出现在版本 3.4.3,但版本 2.7.6 没有
我知道他们在 python 3.
中更改了 round 方法因此,在 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
我不知道它是否对您有帮助,但我将其作为答案发布,因为我的声誉很低,无法发表评论。
问题在这里得到了更恰当的回答:Python 3.x rounding behavior