numpyfloat64与Python float

numpyfloat64与Python float,python,numpy,floating-point,Python,Numpy,Floating Point,我正在处理Pandas read_csv函数中的一些浮点问题。在我的调查中,我发现: 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++双打?< /P> >>> numpy.float64(5.9975).hex() '

我正在处理Pandas read_csv函数中的一些浮点问题。在我的调查中,我发现:

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++双打?< /P>
>>> numpy.float64(5.9975).hex()
'0x1.7fd70a3d70a3dp+2'
>>> (5.9975).hex()
'0x1.7fd70a3d70a3dp+2'

他们是同一个号码。不同的是它们的代表性;Python本机类型使用“sane”表示法,NumPy类型使用精确表示法。

表示法是指它打印到屏幕上的方式?通过
\uu repr\uu()
方法或其C级等效方法,是的。真正精确的表示法实际上是5.99749999999999996092014953319448970708815283203125,这是计算浮点文字
5.9975
@MarkAmery时得到的64位浮点的精确十进制值。浮点64可以达到的最大精度接近10-16(最后一位的单位(ULP),请参阅)因此,一个浮点数的精确十进制值远远超过16位的想法是错误的。@JonathanNappee:事实上,每个数字二进制64表示法都有一个精确的十进制等价物。当我们认为给定的二进制64值表示的十进制值精度要低得多时,就会出现问题。另外请注意,Pandas
read\u csv
函数使用自己的超快字符串到浮点转换,但未正确舍入。因此,在导出值并重新读取后,恢复的值可能最终与原始值不同1或2 ULP。