Zgodnie z dokumentacją Oracle:
Oto jak to widzę :
- Kiedy
Precision
jest większa niż Skala (np.NUMBER(8,5)
), nie ma problemu, to jest proste.Precision
oznacza, że liczba będzie miała łącznie 8 cyfr, z których 5 jest częścią ułamkową (.→), więc część całkowita (←.) będzie miała 3 cyfry. To jest łatwe. -
Gdy zobaczysz, że
Precision
jest mniejszy niżScale
(np.NUMBER(2, 5)
), oznacza to 3 rzeczy:- Liczba nie będzie miała żadnej części całkowitej, tylko część ułamkową. Więc 0 w części całkowitej nie jest liczone w obliczeniach, mówisz 0,12345, a nie 0,12345. W rzeczywistości, jeśli podasz tylko 1 cyfrę w części całkowitej, zawsze zwróci błąd.
Scale
reprezentuje całkowitą liczbę cyfr w części ułamkowej, którą będzie mieć liczba. 5 w tym przypadku. Może to być .12345 lub .00098, ale łącznie nie więcej niż 5 cyfr.- Część ułamkowa jest podzielona na 2 części, liczby znaczące i zera. Znaczące liczby są określone przez
Precision
, a minimalna liczba zer jest równa (Scale
-Precision
). Przykład :
tutaj Liczba musi mieć co najmniej 3 zera w części ułamkowej. po których następują 2 znaczące liczby (również może mieć zero). Czyli 3 zera + 2 znaczące liczby =5, czyli
Scale
numer.
W skrócie, gdy zobaczysz na przykład NUMBER(6,9)
, to mówi nam, że część ułamkowa będzie miała w sumie 9 cyfr, zaczynając od obowiązkowych 3 zer, po których następuje 6 cyfr.
Oto kilka przykładów:
SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual; -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual; -- prints: 0.0136; max 4 digits, .013579 rounded to .0136