2014-11-24 232 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