Според документацията на 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
