如何在python中截断浮点不精确
我正在写一个程序,比较和排列日期序列中的值很重要。然而,我遇到了浮动不精确的问题 我正在从我的SQL server中提取这些数据,它们都应该是1.6。然而,结果证明它们略有不同(见下文)。因此,当我使用dataframe.rank()时,它不会将这两个日期视为相同的排名,而是将2004年2月1日的排名高于2005年2月1日 有人知道如何处理这件事,使这两个人最终成为同一个级别的人吗如何在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',
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,你完全正确,谢谢你指出这一点!我改变了答案