Come gestire gli errori di arrotondamento dei tipi mobili per i calcoli finanziari in Python SQLite?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Sto creando un'app finanziaria e sembra che i miei float in sqlite stiano fluttuando. A volte un 4.0 sarà un 4.000009 e un 6.0 sarà un 6.00006, cose del genere. Come posso renderli più precisi e non influire sui miei calcoli finanziari?

I valori provengono da Python se questo è importante. Non sono sicuro da quale area provengano i numeri incasinati.

È stato utile?

Soluzione

Questo è un problema comune nell'utilizzo di SQLite in quanto non ha un tipo di valuta.
Come ha detto S.Mark, puoi utilizzare la libreria di rappresentazioni Decimal . Tuttavia SQLite 3 supporta solo numeri in virgola mobile binari (tipo sqlite REAL), quindi dovresti archiviare il float con codifica decimale come TEXT o BLOB o convertirlo in REAL (ma poi torneresti a un float binario a 64 bit)
Quindi considera l'intervallo di numeri che devi rappresentare e se devi essere in grado di eseguire calcoli dall'interno del database.

Potrebbe essere meglio usare un DB diverso che supporti i tipi NUMERICI, ad es. MYSql , PostgreSQL , Firebird

Altri suggerimenti

Visto che si tratta di un'applicazione finanziaria, se hai solo calcoli con un massimo di 2 o 3 cifre decimali, puoi archiviare tutti i dati internamente come numeri interi e convertirli in float solo per scopi di presentazione .

per es.

6.00 -> 600
4.35 -> 435

La maggior parte delle persone probabilmente userebbe Decimal per questo, tuttavia se questo non viene mappato su un tipo di database potresti subire un calo delle prestazioni.

Se le prestazioni sono importanti, potresti prendere in considerazione l'utilizzo di Integer per rappresentare un'unità di valuta appropriata - spesso centesimi o decimi di cent sono ok.

Dovrebbero esserci delle regole commerciali su come arrotondare gli importi in varie situazioni e si dovrebbero fare dei test su ogni scenario.

Usa Decimal per manipolare le tue figure, quindi usa pickle per salvarlo e caricarlo da SQLite come testo, poiché non gestisce tipi numerici.

Infine, usa unitest e doctest , per operazioni finanziarie, vuoi assicurarti che tutto il codice faccia quello che si suppone faccia in ogni circostanza. Non puoi correggere bug sulla strada come, diciamo, con un social network ...

Devi usare numeri decimali. I numeri decimali possono essere rappresentati esattamente.

In virgola mobile decimale, 0.1 + 0.1 + 0.1 - 0.3 è esattamente uguale a zero. In virgola mobile binaria, il risultato è 5.5511151231257827e-017.

Quindi, prova solo il decimale:

import decimal
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top