2009-06-29 14 views
219

Ho cercato in Google e anche visitato decimal and numeric e SQL Server Helper per raccogliere la differenza tra tipi di dati numerici, float e decimali e anche per scoprire quale deve essere utilizzato in quale situazione.Differenza tra numerica, virgola mobile e decimale in SQL Server

Per qualsiasi tipo di transazione finanziaria (ad esempio per campo salary), quale è preferibile e perché?

+0

Il collegamento decimale e numerico sopra esigenze aggiornamento ad https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and -numeric-Transact-SQL. Il link sopra non esiste più. –

+0

Di solito, quando si tratta di soggetti finanziari è interessante lavorare con ** tipi Integer **, tranne ** in virgola mobile **, e memorizzare i valori come _cents_, invece di _dollars_, ad esempio. – Pedro

risposta

335

uso del galleggiante o reali tipi di dati solo se pr precisione ovided da decimale (fino a 38 cifre) è insufficiente

  • approssimativo tipi di dati numerici non memorizzano i valori esatti indicati per vari numeri; immagazzinano una strettissima approssimazione del valore. (Technet)

  • Evitare l'uso di float o colonne reali in WHERE condizioni di ricerca clausola, in particolare i = e <> operatori (Technet)

così generalmente perché la precisione fornita dal decimale è [10E38 ~ 38 cifre] se il tuo numero può adattarsi a esso, e lo spazio di archiviazione più piccolo (e forse la velocità) di Float non è importante e si occupano di comportamenti anomali e problemi di tipi numerici approssimativi sono non accettabile, utilizza Decimale in genere.

informazioni più utili

  • numerica = decimale (da 5 a 17 byte) (esatta numerico tipo di dati)
    • sarà mappare decimali.NET
    • entrambi hanno (18, 0) come parametri di default (precisione, scala) nel server SQL
    • scala = numero massimo di cifre decimali che è possibile memorizzare a destra del punto decimale.
    • notare gentilmente che il denaro (8 byte) e smallmoney (4 byte) sono anche esatta e la mappa a decimale .NET e hanno 4 punti decimali (MSDN)
    • decimal and numeric (Transact-SQL) - MSDN
  • reale (4 byte) (approssimativo numerico tipo di dati)
  • galleggiante (8 byte) (approssimativo numerico tipo di dati)
    • mapperà a raddoppiare nei .NET produrre
  • Tutti esatte tipi numerici sempre lo stesso risultato , indipendentemente dal tipo di architettura del processore utilizzata o dall'entità dei numeri
  • Il parametro fornito per il tipo di dati float definisce il numero di bit che è utilizzato per memorizzare mantissa del numero a virgola mobile.
  • approssimativa numerico tipo di dati di solito usa meno spazio e hanno una migliore velocità (fino a 20x) e si dovrebbe anche prendere in considerazione quando si sono convertiti in .NET

Exact Numeric Data Types Approximate Numeric Data Types

principale fonte: MCTS Self-Paced Training Kit (Exam 70-433): Microsoft® SQL Server® 2008 Database Development - Capitolo 3 - Tabelle, tipi di dati, e Lezione 1 dichiarativa integrità dei dati - La scelta dei tipi di dati (linee guida) - Pagina 93

+11

'usa il float o i tipi di dati reali solo se la precisione fornita dai decimali è insufficiente - pensavo che il vero è MENO esatto quindi decimale, quindi come mai scrivere in modo reale se decimale è insufficiente? – BornToCode

+5

reale è meno accurato, quindi non è consigliato a meno di memorizzare grandi numeri più grandi di quello decimale (> 10e38) è necessario o considerazioni sullo spazio. Immagino che la precisione qui nella virgola significhi valori possibili e grandezza non la precisione –

+5

@BornToCode La "precisione" qui si riferisce a quanto ampi sono i valori che si desidera memorizzare. se hai bisogno di memorizzare valori tra 1e10 e 1e-10, allora 'decimal' andrà bene. Questa è una precisione di 20. Se è necessario memorizzare valori compresi, ad esempio, 1e20 e 1e-20, beh, 'decimal' * non può * farlo. Sono 40 cifre di precisione. Non puoi mai memorizzare 1e20 e 1e-20 nello stesso campo 'decimale'. Invece, puoi usare 'float', che memorizza internamente tutto come un log di base 2. Ciò consente una gamma completa di precisione in un campo con l'inconveniente che solo le prime ~ 8 cifre saranno accurate. –

7

Decimale ha una precisione fissa mentre il galleggiante ha una precisione variabile.

EDIT (impossibile leggere l'intera domanda): Float (53) (aka reale) è un numero in virgola mobile a doppia precisione (32 bit) in SQL Server. Regular Float è un numero in virgola mobile a precisione singola. Double è una buona combinazione di precisione e semplicità per molti calcoli. È possibile creare un numero molto preciso con decimale, fino a 136 bit, ma occorre anche fare attenzione a definire la precisione e la scala in modo corretto in modo che possa contenere tutti i calcoli intermedi fino al numero di cifre necessario.

+0

Non hai specificato quale è preferibile mentre il caso va per la transazione finanziaria e perché? –

11

Non è una risposta completa, ma un link utile: ". Mi capita spesso di fare calcoli contro i valori decimali In alcuni casi la fusione valori decimali a stare a galla al più presto, prima di qualsiasi calcolo, i rendimenti migliore precisione"

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

+1

Questo è davvero strano. Ma funziona ... –

+1

Non ha senso. Tutte le altre risposte, con le fonti, dicono che i tipi di dati numerici o decimali sono accurati e che i tipi float o reali sono un'approssimazione molto ravvicinata. A causa di una minore precisione, posso capire che il lancio su float può consentire calcoli più veloci, ma non una precisione più elevata. – cbaldan

+1

Tutti i tipi di dati numerici possono presentare overflow e underflow. L'overflow è un errore esplicito, tuttavia l'underflow è silenzioso. Le caratteristiche di underflow per 'decimal' e' float' sono * diverse *. Il decimale preserva il più possibile l'underflow aumentando la precisione o la scala. Tuttavia, una volta raggiunto il limite di cifre significative in decimale, i flussi in entrata sono silenziosi (e la precisione viene persa). Float ha una gamma di scala più ampia possibile e le sue limitazioni di scala sono in realtà la causa dell'underflow. Quindi, float può avere una scala migliore. Tuttavia, è ancora un tipo * inesatto *. – ErikE

18

Linee guida da MSDN: Using decimal, float, and real Data

La precisione massima predefinita dei tipi di dati numerici e decimali è 38. In Transact-SQL, il valore numerico è funzionalmente equivalente al tipo di dati decimale . 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 su 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 il comportamento numerico esatto , ad esempio nelle applicazioni finanziarie, nelle operazioni che coinvolgono l'arrotondamento o nei controlli di uguaglianza. Al contrario, utilizzare i tipi di dati interi, decimali, in denaro o smallmoney . Evitare l'uso di float o colonne reali nelle condizioni di ricerca della clausola WHERE, in particolare gli operatori = e <>. È consigliabile limitare le colonne float e reali ai confronti> o < confronti .

+0

Il numero (fisso) di decimali è specificato nella colonna 'Scala'. –

+0

Se vuoi "esattamente come specificato" allora, dal punto di vista degli standard, c'è un certo vantaggio per "numerico" poiché non verrà mai memorizzato con più precisione di quanto richiesto: vedi http://stackoverflow.com/a/ 759606/626804 –

9

differiscono per tipo di dati Precedenza

decimale e numerico sono gli stessi funzionalmente ma c'è ancora il tipo di dati precedenza, 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é occorre tipo di dati precedenza.

elenco esaustivo dei tipi di dati da precedenza:

Reference link

1

Float è approssimata numero tipo di dati, il che significa che non tutti i valori nell'intervallo tipo di dati possono essere rappresentati esattamente.

Decimale/numerico è un tipo di dati di 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 il decimale 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 ciascuna combinazione specifica di precisione e scala come un tipo di dati diverso. DECIMAL (2,2) e DECIMAL (2,4) sono tipi di dati diversi. Ciò significa che l'11.22 e l'11.2222 sono tipi diversi, sebbene non sia questo il caso per 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 precisione a 4 cifre per soldi. La maggior parte degli esperti preferisce questo tipo di dati per risparmiare denaro.

Riferimento 1 2 3

Problemi correlati