Wie zu deal mit die Rundungsfehler von floating-Typen für finanzielle Berechnungen in Python-SQLite?

StackOverflow https://stackoverflow.com/questions/1801307

  •  05-07-2019
  •  | 
  •  

Frage

Ich bin die Schaffung einer Finanz-app und es scheint, meine schwebt in sqlite im Umlauf sind.Manchmal 4.0 wird eine 4.000009 und 6.0 wird eine 6.00006, Dinge wie, dass.Wie kann ich diese mehr genaue und keinen Einfluss auf meine finanzielle Berechnungen?

Werte kommen aus Python, wenn diese Angelegenheiten.Nicht sicher in welchen Bereich das Durcheinander von zahlen kommen aus.

War es hilfreich?

Lösung

Dies ist ein häufiges problem mit SQLite als es nicht haben eine Währung geben.
S. Mark sagte, Sie verwenden können die Dezimal Vertretung Bibliothek.Allerdings SQLite 3 unterstützt nur binäre Gleitkommazahlen (sqlite Typ REAL), so würden Sie zum speichern der Dezimal-codierte float entweder als TEXT oder als BLOB oder zu konvertieren, um eine ECHTE(aber dann würden Sie wieder zu einem 64-bit-binary float)
So betrachten die Reihe von zahlen, die Sie benötigen, zu repräsentieren und ob Sie in der Lage sein, Berechnungen durchzuführen, die von innerhalb der Datenbank.

Sie können es besser mit einer anderen DB unterstützt die NUMERISCHEN Typen, z.B. MYSql, PostgreSQL, Firebird

Andere Tipps

Zu sehen, wie dies ist eine finanzielle Anwendung, wenn Sie müssen nur die Berechnungen, die bis zu 2 oder 3 Dezimalstellen, können Sie Sie speichern alle Daten, die intern als ganze zahlen, und nur konvertieren Sie float für Präsentationszwecke.

E. g.

6.00 -> 600
4.35 -> 435

Die meisten Leute würden wahrscheinlich Decimal für diese, aber wenn dies nicht Karte auf einen Datenbank-Typ Sie können einen performance-hit.

Wenn Leistung wichtig ist, möchten Sie vielleicht zu prüfen, mit Ganzzahlen zum darstellen einer entsprechenden Währung Einheit - oft Cent oder Zehntel-Cent ist ok.

Es sollte-business-Regeln, wie Sie die Beträge gerundet werden sollen, in verschiedenen Situationen sollten Sie tests für jedes Szenario.

Verwenden Dezimal zu manipulieren, um Ihre zahlen, dann verwenden Gurke speichern Sie es und laden Sie es von SQLite als text, da es nicht handhaben numerische Typen.

Endlich, verwenden Sie unitest und doctest, für finanzielle Abläufe, möchten Sie sicherstellen alle der code das tut, was es wohl zu tun, in irgendeiner circonstances.Sie können nicht fix bugs auf die Art und Weise, wie mit, sagen wir mal, einem sozialen Netzwerk...

Sie haben die Verwendung von Dezimalzahlen.Dezimalzahlen dargestellt werden können, genau.

In dezimal-floating-point, 0.1 + 0.1 + 0.1 - 0.3 ist exakt gleich null.In binary floating point, das Ergebnis ist 5.5511151231257827e-017.

Also, nur zu versuchen, dezimal:

import decimal
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top