Python数组中的浮点精度问题
我为这个问题太简单而感到抱歉,不过,为什么这两种情况显示的精度会不一样呢?
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'