Quali sono le differenze tra numeric
, float
e decimal
tipi di dati e che dovrebbero essere usati in quali situazioni?
Per qualsiasi tipo di transazione finanziaria (ad esempio per il campo salariale), quale è preferito e perché?
Quali sono le differenze tra numeric
, float
e decimal
tipi di dati e che dovrebbero essere usati in quali situazioni?
Per qualsiasi tipo di transazione finanziaria (ad esempio per il campo salariale), quale è preferito e perché?
Risposte:
utilizzare il tipo float o dati reali solo se la precisione fornita dal decimale (fino a 38 cifre) è insufficiente
I tipi di dati numerici approssimativi non memorizzano i valori esatti specificati per molti numeri; memorizzano un'approssimazione estremamente stretta del valore. ( Technet )
Evitare di utilizzare colonne mobili o reali nelle condizioni di ricerca della clausola WHERE, in particolare gli operatori = e <> ( Technet )
quindi in genere perché la precisione fornita dal decimale è [10E38 ~ 38 cifre] se il numero può adattarsi al suo interno, e lo spazio di archiviazione più piccolo (e forse la velocità) di Float non è importante e gestire comportamenti anomali e problemi di tipo numerico approssimativo non lo è accettabile, usare Decimal in generale .
informazioni più utili
fonte principale : Kit di formazione autonomo MCTS (Esame 70-433): Sviluppo del database Microsoft® SQL Server® 2008 - Capitolo 3 - Tabelle, tipi di dati e integrità dei dati dichiarativi Lezione 1 - Scelta dei tipi di dati (Linee guida) - Pagina 93
use the float or real data types only if the precision provided by decimal is insufficient
- Pensavo che reale fosse MENO accurato quindi decimale, quindi come mai scrivi per usare reale se il decimale è insufficiente?
decimal
andrà bene. Questa è una precisione di 20. Se hai bisogno di memorizzare valori tra, diciamo, 1e20 e 1e-20, beh, decimal
non puoi farlo. Sono 40 cifre di precisione. Non puoi mai memorizzare 1e20 e 1e-20 nello stesso decimal
campo. Invece, è possibile utilizzare float
, che memorizza internamente tutto come un registro di base 2. Ciò consente una gamma completa di precisione in un campo con l'inconveniente che solo le prime ~ 8 cifre saranno accurate.
float
..." - disse chi? È una citazione o la tua opinione?
Linee guida da MSDN: utilizzo di dati decimali, mobili e reali
La precisione massima predefinita dei tipi di dati numerici e decimali è 38. In Transact-SQL, numerico è funzionalmente equivalente al tipo di dati decimali. Utilizzare il tipo di dati decimali per memorizzare numeri con decimali quando i valori dei dati devono essere memorizzati esattamente come specificato.
Il comportamento di float e real segue la specifica IEEE 754 sui tipi di dati numerici approssimativi. A causa della natura approssimativa del float e dei tipi di dati reali, non utilizzare questi tipi di dati quando è richiesto un comportamento numerico esatto, ad esempio nelle applicazioni finanziarie, nelle operazioni di arrotondamento o nei controlli di uguaglianza. Utilizzare invece i tipi di dati interi, decimali, monetari o smallmoney. Evitare di utilizzare colonne mobili o reali nelle condizioni di ricerca della clausola WHERE, in particolare gli operatori = e <>. È consigliabile limitare il float e le colonne reali a> o <confronti.
Scale
colonna.
numeric
poiché non verrà mai archiviato con più precisione di quella che hai richiesto: vedi stackoverflow.com/a/759606/626804
Non una risposta completa, ma un link utile:
"Faccio spesso calcoli contro valori decimali. In alcuni casi, lanciando valori decimali per passare al galleggiante al più presto, prima di qualsiasi calcolo, si ottiene una migliore precisione."
decimal
e float
sono diverse . Il decimale preserva il più possibile dal underflow aumentando la precisione o la scala. Tuttavia, una volta raggiunto il limite di cifre significative in decimale, i underflow diventano silenziosi (e la precisione viene persa). Float ha una gamma più ampia possibile di scala ed è i limiti di scala che in realtà sono la causa del underflow. Pertanto, il galleggiante può avere una scala migliore. Tuttavia, è ancora un tipo inesatto .
Decimale e Numerico sono gli stessi funzionalmente, ma esiste ancora la precedenza del tipo di dati , che può essere cruciale in alcuni casi.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Il tipo di dati risultante è numerico perché ha la precedenza sul tipo di dati .
Elenco esaustivo di tipi di dati per precedenza:
Il decimale ha una precisione fissa mentre il float ha una precisione variabile.
EDIT (impossibile leggere l'intera domanda): Float (53) (aka real) è un numero a virgola mobile a precisione doppia (32 bit) in SQL Server. Il float regolare è un numero in virgola mobile a precisione singola. Il doppio è una buona combinazione di precisione e semplicità per molti calcoli. Puoi creare un numero di precisione molto elevato con decimale - fino a 136 bit - ma devi anche fare attenzione a definire la precisione e ridimensionare correttamente in modo che possa contenere tutti i tuoi calcoli intermedi al numero necessario di cifre.
Float è un tipo di dati con numero approssimativo, il che significa che non tutti i valori nell'intervallo del tipo di dati possono essere rappresentati esattamente.
Decimale / Numerico è un tipo di dati a precisione fissa, il che significa che tutti i valori nell'intervallo del tipo di dati possono essere rappresentati esattamente con precisione e scala. È possibile utilizzare i decimali per risparmiare denaro.
La conversione da decimale o numerico a virgola mobile può causare una perdita di precisione. Per i tipi di dati Decimali o Numerici, SQL Server considera ogni combinazione specifica di precisione e scala come un diverso tipo di dati. DECIMAL (2,2) e DECIMAL (2,4) sono diversi tipi di dati. Ciò significa che 11.22 e 11.2222 sono tipi diversi anche se questo non è il caso di float. Per FLOAT (6) 11.22 e 11.2222 sono gli stessi tipi di dati.
È inoltre possibile utilizzare il tipo di dati denaro per risparmiare denaro. Questo è un tipo di dati nativo con una precisione di 4 cifre per denaro. La maggior parte degli esperti preferisce questo tipo di dati per risparmiare denaro.
Di cosa ha bisogno?
Deriva dal fatto che, alla fine, i computer rappresentano, internamente, numeri in formato binario. Ciò comporta inevitabilmente errori di arrotondamento.
Considera questo:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
I puntini di sospensione sopra [...] significano "infinito". Se lo guardi attentamente, c'è un modello ripetuto infinito (= '0011')
Quindi, ad un certo punto il computer deve arrotondare quel valore. Ciò porta a errori di accumulazione derivanti dall'uso ripetuto di numeri memorizzati in modo inesatto.
Supponi di voler memorizzare importi finanziari (che sono numeri che possono avere una parte frazionaria). Prima di tutto, ovviamente non puoi usare numeri interi (i numeri interi non hanno una parte frazionaria). Da un punto di vista puramente matematico, la tendenza naturale sarebbe quella di usare a float
. Ma, in un computer, i float hanno la parte di un numero che si trova dopo un punto decimale - la "mantissa" - limitata. Ciò porta ad errori di arrotondamento.
Per ovviare a questo, i computer offrono tipi di dati specifici che limitano l'errore di arrotondamento binario nei computer per i numeri decimali. Questi sono i tipi di dati che dovrebbero assolutamente essere utilizzati per rappresentare gli importi finanziari. Questi tipi di dati in genere si chiamano Decimal
. Questo è il caso in C #, per esempio. O, DECIMAL
nella maggior parte dei database.
Sebbene la domanda non includa il tipo di dati MONEY, alcune persone che incontrano questo thread potrebbero essere tentate di utilizzare il tipo di dati MONEY per i calcoli finanziari.
Diffidare del tipo di dati MONEY, è di precisione limitata.
Ci sono molte buone informazioni a riguardo nelle risposte a questa domanda StackOverflow:
Dovresti scegliere i tipi di dati MONEY o DECIMAL (x, y) in SQL Server?