Python数组中的浮点精度问题

5 投票
1 回答
17561 浏览
提问于 2025-04-16 12:46

我为这个问题太简单而感到抱歉,不过,为什么这两种情况显示的精度会不一样呢?

1)

>> test = numpy.array([0.22])
>> test2 = test[0] * 2
>> test2
0.44

2)

>> test = numpy.array([0.24])
>> test2 = test[0] * 2
>> test2
0.47999999999999998

我在64位的Linux系统上使用的是python2.6.6。谢谢你们的帮助。

这在Python中的列表也似乎是这样。

>>> t = [0.22]
>>> t
[0.22]

>>> t = [0.24]
>>> t
[0.23999999999999999]

1 个回答

6

因为它们是不同的数字,而不同的数字在四舍五入时会有不同的效果。

(右侧的相关问题几乎都能解释四舍五入效果的原因。)


好吧,接下来是更严肃的回答。看起来numpy对数组中的数字进行了某种转换或计算:

>>> t = numpy.array([0.22])
>>> t[0]
0.22


>>> t = numpy.array([0.24])
>>> t[0]
0.23999999999999999

而Python则不会自动这样做:

>>> t = 0.22
>>> t
0.22

>>> t = 0.24
>>> t
0.24

四舍五入的误差小于numpy的“eps”值,对于float类型,这意味着它们应该被视为相等(实际上,它们确实是相等的):

>>> abs(numpy.array([0.24])[0] - 0.24) < numpy.finfo(float).eps
True

>>> numpy.array([0.24])[0] == 0.24
True

但是Python显示为'0.24'而numpy不这样做的原因是,Python的默认float.__repr__方法使用了较低的精度(如果我没记错的话,这是最近的一个变化):

>>> str(numpy.array([0.24])[0])
0.24

>>> '%0.17f' % 0.24
'0.23999999999999999'

撰写回答