Según la documentación de Oracle:
Así es como lo veo:
- Cuando
Precision
es mayor que Scale (p. ej.,NUMBER(8,5)
), no hay problema, esto es sencillo.Precision
significa que el número tendrá un total de 8 dígitos, 5 de los cuales están en la parte fraccionaria (.→), por lo que la parte entera (←.) tendrá 3 dígitos. Esto es fácil. -
Cuando veas esa
Precision
es menor queScale
(por ejemplo,NUMBER(2, 5)
), esto significa 3 cosas:- El número no tendrá ninguna parte entera, solo una parte fraccionaria. Entonces, el 0 en la parte entera no se cuenta en los cálculos, dices .12345, no 0.12345. De hecho, si especifica solo 1 dígito en la parte entera, siempre devolverá un error.
- La
Scale
representa el número total de dígitos en la parte fraccionaria que tendrá el número. 5 en este caso. Entonces puede ser .12345 o .00098 pero no más de 5 dígitos en total. - La parte fraccionaria se divide en 2 partes, números significativos y ceros. Los números significativos se especifican mediante
Precision
, y el número mínimo de ceros es igual a (Scale
-Precision
). Ejemplo:
aquí El número deberá tener un mínimo de 3 ceros en la parte fraccionaria. seguido de 2 números significativos (también podría tener un cero). Así que 3 ceros + 2 números significativos =5 que es la
Scale
número.
En resumen, cuando vea, por ejemplo, NUMBER(6,9)
, esto nos dice que la parte fraccionaria tendrá 9 dígitos en total, comenzando por 3 ceros obligatorios y seguido de 6 dígitos.
Estos son algunos ejemplos:
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