Python 数据帧浮点问题

Python 数据帧浮点问题,python,pandas,floating-point,Python,Pandas,Floating Point,我有一个带有浮点值的列,如600.0750、600.2274600.3798、600.5322。我将这些值四舍五入到小数点后3位,然后将diff()函数应用到该列,该列给出了0.1524,0.1524和0.1524,以从输出中删除重复项,我应用了删除重复项。我本来只希望看到0.1524,但实际上我得到了0.1524,0.1524,0.1524 因此,我将输出值存储在另一个数据帧df_diff中,并执行df_diff.iloc[2],它给出了0.15239999994325,对于df_diff.i

我有一个带有浮点值的列,如
600.0750、600.2274600.3798、600.5322
。我将这些值四舍五入到小数点后3位,然后将
diff()
函数应用到该列,该列给出了
0.1524,0.1524
0.1524
,以从输出中删除重复项,我应用了
删除重复项
。我本来只希望看到
0.1524
,但实际上我得到了
0.1524,0.1524,0.1524

因此,我将输出值存储在另一个数据帧df_diff中,并执行
df_diff.iloc[2]
,它给出了
0.15239999994325
,对于
df_diff.iloc[3]
我得到
0.15240000000005693

我返回并对原始df执行相同的操作,得到
600.07500000000005
。因此,即使我进行四舍五入,值也不会四舍五入。我能做些什么来解决这个问题


谢谢你说你四舍五入到小数点后三位,但是你的数字有四位。以下假设四是正确的数字


有几种选择。首先,您可以在尝试删除重复项之前尝试不舍入。如果这不起作用,如果你对精确的精度水平不太在意,你可以四舍五入到2的幂,比如2**14。第二种选择是使用该模块。第三种方法是将数字乘以10000,然后四舍五入为整数。如果您想恢复原始数字,则可以再次将其除以10000。

浮点数学不精确。…@juanpa.arrivillaga:浮点数学定义良好。这个问题不仅仅是举手说我们不知道浮点是如何工作的。仅供参考(不是更大问题的解决方案),你说的“值没有四舍五入”很可能是错误的。这些值很可能是四舍五入的,但最终结果仍然必须用64位二进制浮点表示。因此,精确值600.0750、600.2274、600.3798和600.5322变为600.0750000000000454747350886411895751953125、600.2273999999887222656980156689849853515625600.3798000000004566340290009997543334969375,和600.53219999999889041646383702754974365234375.@juanpa.arrivillaga我发现尝试将
isclose
drop_duplicates
结合起来的问题是
is_close
不是等价关系。假设你的数字是[100+ε/2100+ε,100+3*ε/2…110]。它会减少一半的数字吗?全部的没有?是的,你是对的。我认为乘以10000,可能与地板结合使用,然后使用
astype(np.int)
然后使用这些数字进行差异/比较,或者再次,只需等待四舍五入直到结束。舍入重复项的相关因素不是舍入结果是否与它们显示为四位十进制数字的方式相同,而是给定两个显示为相同四位数字的数字,它们是否都舍入为相同的数字。由于舍入一般不会分布在其他操作上,所以应该最后进行。