NumPy float64与Python float的区别

57

我在 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内置的浮点数类型floatnp.float64类型会给出不同的结果?我原以为它们都是C++的双精度浮点数。

7
请注意,Pandas 的 read_csv 函数采用了其自己的超快速字符串转浮点数的方法,但这种方法 进行正确舍入。因此,在导出值并重新读取后,恢复的值可能与原始值相差 1 或 2 ulps。 - Mark Dickinson
@MarkDickinson,这也适用于read_excel吗? - Gathide
@Gathide 不好意思,我也不知道。 - Mark Dickinson
1个回答

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

它们是相同的数字,不同之处在于它们的表示方式。Python内置类型使用“正常”的表示方式,而NumPy类型使用准确的表示方式。


2
你所说的“representation”,是指它在屏幕上的显示方式吗? - mchangun
2
通过__repr__()方法或其C级等效方法,是的。 - Ignacio Vazquez-Abrams
5
一个真正“准确”的表示实际上应该是5.99749999999999960920149533194489777088165283203125,这是当你计算浮点字面值5.9975时得到的64位浮点数的精确十进制值。 - Mark Amery
3
一个float64类型的数字最高可以达到约10^-16个单位(即位于最后一位),请参见https://en.wikipedia.org/wiki/Floating-point_arithmetic。因此,对于浮点数而言,具有显著超过16位数字的精确十进制值的概念是误导性的。 - Jonathan Nappee
8
每个数字的二进制64位表示实际上都有一个确切的十进制等价物。问题出在我们认为某个二进制64位值代表了一个明显不太精确的十进制值时。 - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接