2014-11-24 99 views
13

我在Pandas read_csv函数中遇到了一些浮点问题。在我的调查,我发现这一点:Numpy float64 vs Python float

In [15]: a = 5.9975 

In [16]: a 
Out[16]: 5.9975 

In [17]: np.float64(a) 
Out[17]: 5.9974999999999996 

为什么是Python内置float和Python中给出不同的结果np.float64类型?我认为他们都是C++双打?

+1

还要注意,Pandas'read_csv'函数使用了它自己的超快速字符串到float的转换,它*不是正确舍入的。因此,在输出一个值并重新读取它之后,恢复的值最终可能会与原始值不同,为1或2个ulps。 – 2014-11-24 08:41:59

回答

12
>>> numpy.float64(5.9975).hex() 
'0x1.7fd70a3d70a3dp+2' 
>>> (5.9975).hex() 
'0x1.7fd70a3d70a3dp+2' 

它们是相同的数字。他们的代表有什么不同? Python本机类​​型使用“理性”表示,而NumPy类型使用精确表示。

+0

通过表示,你是指它被打印到屏幕的方式? – mchangun 2014-11-24 06:16:05

+0

通过'__repr __()'方法或其C级等价物,是的。 – 2014-11-24 06:18:01

+1

一个真正的*精确的*表示实际上是5.99749999999999960920149533194489777088165283203125,这是您在计算浮点文字'5.9975'时得到的64位浮点数的精确十进制值。 – 2016-03-17 12:19:20