Decimale vs. intero; Dato un intervallo di valori fisso, che è preferibile per un calcolo accurato?

4

Dopo essere entrato in una "discussione accesa" con qualcuno, ho pensato di fare questa domanda per amore dei posteri. Sono disposto a essere corretto se la mia ipotesi non è corretta, ma mi piacerebbe sentire un'opinione di terzi da qualcuno con più credibilità di me.

Supponiamo di dover calcolare e memorizzare valori numerici che sono espressi in un formato decimale. Tuttavia, tutti gli input e gli output numerici devono adattarsi all'interno di un intervallo di valori specifico. Inoltre, i decimali sono importanti ma non saremo mai interessati a valori inferiori a una cifra decimale specifica. Questo è vero per qualsiasi calcolo. Se un calcolo produce un valore contenente cifre significative sotto l'intervallo 10 ^ -8, sono essenzialmente 0. Analogamente, se il valore è superiore al limite superiore, viene considerato un caso di errore.

Considerando questi vincoli fissi, che non cambieranno mai, è meglio usare un tipo di dati Decimal (s, p) tradizionale o usare un tipo Integer che può contenere tutti i valori rappresentati spostando il valore cifre decimali s fisse a sinistra? Ad esempio, per efficienza e precisione, dovremmo usare numeri interi compresi tra 0 e 2.100.000.000.000.000 per rappresentare tutti i valori compresi tra .00000001 e 21.000.000 o dovremmo usare decimali definiti come (8, 16)?

Chiarimento

La mia discussione specifica riguardava i tipi di dati all'interno di MySQL. Preferirei una risposta generica, supponendo che la maggior parte delle rappresentazioni decimali siano memorizzate in un formato standardizzato. Tuttavia, se non esiste uno "standard" affidabile per le definizioni dei tipi decimali, considera questa domanda in relazione a MySQL.

    
posta RLH 15.10.2014 - 15:48
fonte

2 risposte

2

Per la memorizzazione del database, decimali.

TL; DR Backstory

Se stavi elaborando questi risultati principalmente nella memoria principale, potrebbe essere un errore. Esistono molti problemi in virgola mobile e decimali di piccola portata che possono essere risolti con interi in scala e matematica a punti fissi . Ad esempio, ho risolto questo questo recente problema di partizionamento da Stack Overflow nel regno intero, quindi ha restituito la risposta come virgola mobile. Ho anche visto molti algoritmi di formattazione del testo e di layout grafico che usano approssimazioni simili. La matematica intera è semplice, molto veloce e funziona bene.

Ma, senza limitare ulteriormente il tuo caso d'uso, ci sono degli svantaggi, come ad esempio il fatto che diventi una tua responsabilità per

  • Fornisci funzioni matematiche come sin e sqrt di cui potresti aver bisogno.
  • Converti dagli interi in scala personalizzati ad altri tipi che potrebbero essere necessari, ad esempio la formattazione in stringhe o in virgolette e tipi decimali corretti.

Quelle sono "una semplice questione di sforzo", ma i dettagli su come ottenere quelle cose giuste possono essere irritanti e distrarti dai tuoi obiettivi di programmazione primari.

Aggiungi a questo che sei specificamente interessato a memorizzare questi valori in un database. Ciò implica la permanenza e una lunga durata dei dati. Se c'è qualcosa che abbiamo imparato sui dati a precisione fissa in questo settore, è che i requisiti cambieranno nel tempo e quindi dovrai modificare i tuoi dati e le app che li utilizzano. Pensa Y2K o finanziario decimalizzazione del mercato . Il punto fisso sembra una solida base, ma in alcuni anni la precisione della precisione decimale potrebbe cambiare. La scala scelta per le parti interne della stampante quando le stampanti a 300 dpi sembravano impossibilmente ad alta risoluzione non era così precisa quando le stampanti a 1200- e 2400 dpi rotolarono in pochi anni dopo.

Quindi, se sei interessato a rappresentazioni efficienti in memoria adattate a problemi specifici, il punto fisso può funzionare bene. Ma se si memorizzano i dati nel tempo, i decimali rappresentano una rappresentazione più ricca, a prova di futuro, che qualcun altro si assume la responsabilità di lavorare, riportandovi alle proprie attività di sviluppo.

    
risposta data 15.10.2014 - 22:36
fonte
3

Usa decimali. Considerare

2.00 * 3.00 = 6.00 (as-is)

200 * 300 = 60000 (hmm: /100)

Non è necessario pensare "più ottimale", il computer probabilmente lo farà anche in modo ottimale. Tutte le catture affrontate.

È particolarmente complicato in SQL, utilizzare in modo coerente i propri numeri interi , magari introducendo la propria funzione, ma allo stesso tempo impedire a SQL di ottimizzare alcune query che sarebbero state basate su colonne .

Inoltre, considera che in un dato momento i dati devono essere utilizzati nel codice. E poi esattamente lo stesso problema si ripete: moltiplicazione. E gli automatismi come ORM diventano più complicati.

    
risposta data 15.10.2014 - 17:51
fonte

Leggi altre domande sui tag