如何在python中截断浮点不精确

如何在python中截断浮点不精确,python,pandas,floating-point,precision,Python,Pandas,Floating Point,Precision,我正在写一个程序,比较和排列日期序列中的值很重要。然而,我遇到了浮动不精确的问题 我正在从我的SQL server中提取这些数据,它们都应该是1.6。然而,结果证明它们略有不同(见下文)。因此,当我使用dataframe.rank()时,它不会将这两个日期视为相同的排名,而是将2004年2月1日的排名高于2005年2月1日 有人知道如何处理这件事,使这两个人最终成为同一个级别的人吗 modelInputData.loc['01/02/2004',('Level','inflationCore',

我正在写一个程序,比较和排列日期序列中的值很重要。然而,我遇到了浮动不精确的问题

我正在从我的SQL server中提取这些数据,它们都应该是1.6。然而,结果证明它们略有不同(见下文)。因此,当我使用dataframe.rank()时,它不会将这两个日期视为相同的排名,而是将2004年2月1日的排名高于2005年2月1日

有人知道如何处理这件事,使这两个人最终成为同一个级别的人吗

modelInputData.loc['01/02/2004',('Level','inflationCore','EUR')]
Out[126]: 1.6000000000000003

modelInputData.loc['02/01/2005',('Level','inflationCore','EUR')]
Out[127]: 1.6000000000000001

可以对带有浮点数的列使用pd.Series.round()

precision = 2
df['col'] = df['col'].round(decimals = precision)

请参阅:

我建议您像银行家一样使用美分和整数,而不是欧元/美元和浮动/十进制变量

在MySQL端将其转换为美分或在pandas中执行:

df['amount'] = round(df['amount']*100)

与Python文档相比,您在浮点问题和限制方面的问题要少得多:。听起来浮点不是正确的解决方案。如果计算需要任意精度,请使用小数,而不是浮点数:是的,我可能最终会这样做。谢谢decimal.decimal不支持转换熊猫数据帧/系列(或者任何类似列表的对象),很遗憾(或者至少我无法理解)。我将把整件事情乘以100,然后转换成整数。如果这些数字小于你选择的任何精度怎么办?当你这样做时,误差实际上保持不变,但奇怪的是,它们现在是一样的(1.6000000000000001)。但一般来说,舍入并不能解决不准确的问题,请在此处使用
round
;直接使用
int
可能会意外截断值。例如,
int(0.29*100)
->
28
@MarkDickinson,你完全正确,谢谢你指出这一点!我改变了答案