In other languages such as C, Java, etc. the standards for representing whole and fractional numbers are different.
In C e vari linguaggi di programmazione, gli interi (INT () in SQL) sono in genere stringhe di bit interi e numeri in virgola mobile (FLOAT () / DOUBLE () in SQL) vengono solitamente memorizzati come IEEE-754 / - Stringhe di bit compatibili con 854.
DECIMAL () e NUMERIC () utilizzano in genere il decimale codificato in codice binario (BCD).
Un numero intero a 32 bit, pieno e con segno, memorizzerà -2-miliardi-or-so a +2 miliardi di dollari. È possibile utilizzare in modo affidabile 9 cifre, +/-, ma non 10. Per più di 10, è necessario il passo successivo del numero intero, che probabilmente sarà di 64 bit.
IEEE-754 si occupa della memorizzazione di numeri in virgola mobile in una sequenza a 32 bit. Memorizza:
- un bit per il segno
- più bit per un esponente relativo
- più bit per una mantissa
In questo modo, contiene diverse cifre significative e una serie di esponenti. L'ordine dei bit è tale che è possibile trattarli come interi con segno a 32 bit, a scopo di confronto, e si dovrebbe ottenere la risposta giusta. In questo modo, non devi avere diversi modi per confrontare interi vs float. L'IEEE-854 porta questo a 64-bit, allocando più bit all'esponente relativo e alla mantissa, consentendo più cifre di precisione e una gamma più ampia di esponenti.
Il problema con questi valori in virgola mobile è che sono tutte le approssimazioni. E loro (almeno, i formati più vecchi, più comunemente supportati) sono tutti basati su esponenti di 2, non esponenti di 10. Ergo, non esiste alcuna rappresentazione ESATTA, in nessuno dei due, per 1.1 o 1.01; non c'è un esponente di 2 che puoi moltiplicare di questi e ottenere un valore esatto. Se gestisci transazioni finanziarie, non vuoi un'approssimazione. Se devi arrotondare, vuoi occuparti di esponenti di 10, non di 2, perché è così che denominiamo denaro.
DECIMAL () e NUMERIC () sono animali diversi, usando BCD. Se si definisce DECIMAL (7,2), questo memorizzerà un totale di 7 cifre decimali, tenendo traccia del fatto che 2 di esse sono dietro il punto decimale. Sono 7 cifre significative, nessuna approssimazione. Questo probabilmente si adatta a 32 bit di spazio (4 bit per ogni cifra + 4 bit per il campo totale, per memorizzare il segno, null, ecc.). Se moltiplichi due campi DECIMAL (7,2), sai PRECISAMENTE, fino al penny, cosa otterrai. Nessuna approssimazione.
E il summenzionato DECIMAL (10) avrà probabilmente solo 48 bit di spazio da memorizzare. E puoi utilizzare tutte e 10 le cifre, positive e negative.
Perhaps databases do not need to perform numeric computations often. Perhaps digit width of a column is a natural extension of character width. Perhaps SQL was supposed to be a non-programmers language (because it sounds like English :) )? Perhaps history took a weird turn, such as one that allowed the inferior VHS format to prosper.
Ho paura di non essere d'accordo con te, lì. I database che mi occupo fanno un sacco di calcoli numerici. La maggior parte di esso, tuttavia, è di dollari e centesimi, che in gran parte RICHIEDE la precisione del BCD e dei relativi formati DECIMAL (x, y). Il fatto che BCD mastichi 4 bit / cifra, mentre ASCII ne usa 8, è per lo più casuale.
L'invenzione di SQL è accreditata a E. F. Codd, che lavorava in IBM. Nessuna sorpresa, quindi, che la formattazione di DECIMAL (x, y) venga ampiamente rubata da FORTRAN.