Numeryczne typy danych
Typy numeryczne w Derby dzielą się na:
- całkowite
- zmiennoprzecinkowe (przybliżone)
- liczby o wskazanej precyzji
- DECIMAL – ze wskazaną dokładnością
- NUMERIC – identyczny z typem DECIMAL (alias)
Przy wykonywaniu obliczeń arytmetycznych (w wyrażeniach) mogą być użyte różne typy danych. Jeżeli w wyrażeniu występują wyłącznie typy całkowite, a najwyższym typem jest SMALLINT – wynik jest typu INTEGER. Jeśli najwyższym typem jest inny typ – to wynik jest tego typu co najwyższy typ występujący w wyrażeniu.
Jeżeli w wyrażeniu występują zarówno typy całkowite jak i inne albo wyłącznie inne i nie występuje typ DECIMAL, to wynik jest typu DOUBLE PRECISION. Jeśli typ DECIMAL występuje – to wynik jest tego typu.
Można to przedstawić w tabelce:
Najwyższy typ danych w wyrażeniu | Typ wyniku |
---|---|
SMALLINT | INTEGER |
INTEGER | INTEGER |
BIGINT | BIGINT |
REAL | DOUBLE |
DOUBLE | DOUBLE |
FLOAT | DOUBLE |
DECIMAL | DECIMAL> |
Przy wstawianiu danych do tabeli w bazie wartość typu zmiennoprzecinkowego wyższego można wstawić do kolumny o niższym typie jeśli wartość wyższego typu nie jest większa od wartości najwyższej dla typu kolumny. Jeśli wstawiana wartość przekracza maksymalną wartość dopuszczalną dla typu – wyrzucany jest wyjątek.
Jeśli wartość zmiennoprzecinkowa będzie wstawiana do typu całkowitego to wstawiona zostanie wyłącznie część całkowita, a część ułamkowa zostanie odcięta.
Dane typu INTEGER mogą być wstawiane do kolumn DECIMAL jeśli typ DECIMAL ma wystarczającą precyzję. Jeśli precyzja jest zbyt mała – zostanie wyrzucony wyjątek.
W przypadku użycia liczb typu DECIMAL podawana jest:
- precyzja p- oznacza całkowitą liczbę cyfr w liczbie, czyli sumę liczb przed przecinkiem i po przecinku
- skala s- czyli liczbę miejsc po przecinku
Precyzja i skala wyniku zależy od skali i precyzji składników wyrażenia.
Jeżeli wykonujemy obliczenia na dwóch liczbach A (Ap, As) i B(Bp, Bs) to wynik C(Cp, Cs) będzie miał następującą skalę:
Działanie | Skala wyniku Cs |
---|---|
Mnożenie A * B | Cs = As + Bs |
Dzielenie A / B | Cs = 31 – Ap + As – Bs |
funkcja AVG(A, B) | Cs = max(max(As, Bs), 4) |
Wszystkie pozostałe | Cs = max(As, Bs) |
Działanie | Precyzja wyniku Cp |
---|---|
Mnożenie A * B | Cp = Ap + Bp |
Dzielenie A / B | Cp = Ap – As + Bp + max(As + Bp – Bs + 1, 4) |
Wszystkie pozostałe | Cp = max(Ap – As, Bp – Bs) + max(As, Bs) + 1 |