Enligt Oracle Documentation:
Så här ser jag det :
- När
Precision
är större än skala (t.ex.NUMBER(8,5)
), inga problem, det här är enkelt.Precision
betyder att talet kommer att ha totalt 8 siffror, varav 5 är i bråkdelen (.→), så heltalsdelen (←.) kommer att ha 3 siffror. Det här är enkelt. -
När du ser den
Precision
är mindre änScale
(t.ex.NUMBER(2, 5)
), betyder detta 3 saker :- Numret kommer inte att ha någon heltalsdel, bara bråkdel. Så nollan i heltalsdelen räknas inte med i beräkningarna, du säger .12345 inte 0.12345. Faktum är att om du bara anger en siffra i heltalsdelen kommer det alltid att returnera ett fel.
Scale
representerar det totala antalet siffror i bråkdelen som talet kommer att ha. 5 i detta fall. Så det kan vara .12345 eller .00098 men inte mer än 5 siffror totalt.- Bråkdelen är uppdelad i 2 delar, signifikanta tal och nollor. Betydande tal anges med
Precision
, och minsta antal nollor är lika med (Scale
-Precision
). Exempel:
här Numret ska ha minst 3 nollor i bråkdelen. följt av 2 signifikanta tal (kan också ha en nolla). Så 3 nollor + 2 signifikanta tal =5 vilket är
Scale
nummer.
Kort sagt, när du till exempel ser NUMBER(6,9)
, detta talar om för oss att bråkdelen kommer att ha 9 siffror totalt, som börjar med obligatoriska 3 nollor och följs av 6 siffror.
Här är några exempel:
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