2016-03-30 8 views
2

Ich schreibe ein Programm, für das es wichtig ist, Werte in einer Datumsreihe zu vergleichen und zu bewerten. Allerdings habe ich Probleme mit der Ungenauigkeit der SchwimmerWie Ungenauigkeit der Fließkommazahl in Python abgeschnitten

Ich ziehe diese Daten von meinem SQL-Server, die beide 1,6 sein sollen. Sie erweisen sich jedoch als etwas anders (siehe unten). Wenn ich also Dataframe.rank() verwende, behandelt es diese beiden Daten nicht als den gleichen Rang, sondern rangiert 01/02/2004 über 02/01/2005.

Hat jemand eine Idee, wie man damit umgeht, damit diese beiden auf dem gleichen Rang landen?

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

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

Python-Dokumentation zu Problemen und Einschränkungen von Gleitkommazahlen: https://docs.python.org/2/tutorial/floatingpoint.html. –

+1

Sounds wie Floats sind hier nicht die richtige Lösung. Wenn Berechnungen eine willkürliche Genauigkeit haben müssen, verwenden Sie Dezimalzahlen, keine Gleitkommazahlen: https://docs.python.org/2/library/decimal.html#module-decimal –

+0

Ja, ich werde wahrscheinlich am Ende damit fertig werden. Vielen Dank! – jjvandermade

Antwort

2

Ich würde Ihnen empfehlen, es zu tun, wie Banker tun - Verwendung Cent und ganze Zahlen anstelle von EUR/USD und Schwimmer/Dezimal-Variablen

entweder konvertieren sie auf die zu cents MySQL Seite oder tun es in Pandas:

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

Sie werden viel weniger Probleme haben, dann

+1

Bitte verwenden Sie 'rund' hier; Die direkte Verwendung von "int" -Risiken schneidet Werte versehentlich ab. Z.B. 'int (0.29 * 100)' -> '28'. –

+0

@MarkDickinson, du hast absolut recht, danke, dass du das gezeigt hast! Ich habe meine Antwort geändert – MaxU

5

Sie können pd.Series.round() für die Spalten mit Floats verwenden.

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

See: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.round.html

+0

Was ist, wenn die Zahlen kleiner sind als die Präzision, die Sie wählen? –

+0

Die Ungenauigkeit bleibt tatsächlich, wenn Sie dies tun, aber komischerweise sind sie jetzt gleich (1.6000000000000001). Im Allgemeinen löst das Runden das Ungenauigkeitsproblem jedoch nicht – jjvandermade

Verwandte Themen