Според документацията на Oracle:
Ето как го виждам аз:
- Когато
Precision
е по-голямо от мащаб (напр.NUMBER(8,5)
), няма проблем, това е лесно.Precision
означава, че числото ще има общо 8 цифри, 5 от които са в дробната част (.→), така че цялата част (←.) ще има 3 цифри. Това е лесно. -
Когато видите този
Precision
е по-малък отScale
(напр.NUMBER(2, 5)
), това означава 3 неща:- Числото няма да има цяла част, а само дробна част. Така че 0 в целочислената част не се отчита при изчисленията, вие казвате 0,12345, а не 0,12345. Всъщност, ако посочите само 1 цифра в целочислената част, тя винаги ще връща грешка.
Scale
представлява общия брой цифри в дробната част, които числото ще има. 5 в този случай. Така че може да бъде .12345 или .00098, но не повече от общо 5 цифри.- Дробната част е разделена на 2 части, значими числа и нули. Значимите числа са посочени от
Precision
, а минималният брой нули е равен на (Scale
-Precision
). Пример :
тук Числото ще трябва да има минимум 3 нули в дробната част. последвано от 2 значими числа (може да има и нула). Така че 3 нули + 2 значими числа =5, което е
Scale
номер.
Накратко, когато видите например NUMBER(6,9)
, това ни казва, че дробната част ще има общо 9 цифри, започващи със задължителните 3 нули и последвани от 6 цифри.
Ето няколко примера:
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