Python SQLiteの財務計算のために浮動型の丸めエラーを処理する方法は?
-
05-07-2019 - |
質問
私は金融アプリを作成していますが、sqliteのフロートが浮かんでいるようです。 4.0が4.000009になり、6.0が6.00006になることもあります。どうすればこれらをより正確にし、財務計算に影響を与えないのですか?
それが重要な場合、値はPythonから取得されます。混乱した数字がどこから来たのかわからない。
解決
これは、通貨タイプがないため、SQLiteを使用する一般的な問題です。
S.Markが言ったように、 Decimal 表現ライブラリを使用できます。ただし、SQLite 3はバイナリ浮動小数点数(sqlite型REAL)のみをサポートするため、Decimalエンコードされた浮動小数点数をTEXTまたはBLOBとして保存するか、REALに変換する必要があります(ただし、64ビットのバイナリ浮動小数点数に戻ります)
したがって、表現する必要がある数値の範囲と、データベース内から計算を実行できるようにする必要があるかどうかを検討してください。
NUMERIC型をサポートする別のDBを使用したほうがよい場合があります。 MYSql 、 PostgreSQL 、 Firebird
他のヒント
10進数を使用してください
これは金融アプリケーションであるため、小数点以下2桁または3桁までしか計算できない場合は、すべてのデータを整数として内部的に保存し、表示目的でのみ浮動に変換できます。
E.g。
6.00 -> 600
4.35 -> 435
ほとんどの人はおそらくこれにDecimalを使用しますが、これがデータベースタイプにマッピングされない場合、パフォーマンスが低下する可能性があります。
パフォーマンスが重要な場合は、整数を使用して適切な通貨単位を表すことを検討してください。多くの場合、セントまたはセントの10分の1で十分です。
さまざまな状況で金額を丸める方法に関するビジネスルールがあり、各シナリオをカバーするテストが必要です。
10進数を使用する必要があります。 10進数は正確に表すことができます。
10進浮動小数点では、 0.1 + 0.1 + 0.1-0.3
はゼロに正確に等しくなります。バイナリ浮動小数点では、結果は 5.5511151231257827e-017です。
したがって、10進数を試してください:
import decimal