¿Cómo puede un NÚMERO de Oracle tener una Escala mayor que la Precisión?
Pregunta
La documentación dice:"La precisión puede variar de 1 a 38.La escala puede oscilar entre -84 y 127".
¿Cómo puede la escala ser mayor que la precisión?¿No debería la escala oscilar entre -38 y 38?
Solución
La pregunta podría ser ¿por qué no? Pruebe el siguiente código SQL.?
select cast(0.0001 as number(2,5)) num,
to_char(cast(0.0001 as number(2,5))) cnum,
dump(cast(0.0001 as number(2,5))) dmp
from dual
Lo que se ve es que se puede mantener un pequeño número está ese tipo de estructura Podría no ser necesaria mucha frecuencia, pero estoy seguro de que en algún lugar hay alguien que está almacenando números muy precisos pero muy pequeñas.
Otros consejos
Según la documentación de Oracle:
La escala puede ser mayor que la precisión, más comúnmente cuando se usa la notación ex (donde la parte decimal puede ser muy grande).Cuando la escala es mayor que la precisión, la precisión especifica el número máximo de dígitos significativos a la derecha del punto decimal.Por ejemplo, una columna definida como
NUMBER(4,5)
requiere un cero para el primer dígito después del punto decimal y redondea todos los valores más allá del quinto dígito después del punto decimal.
Así es como lo veo:
- Cuando
Precision
es mayor que la escala (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 facil. cuando veas eso
Precision
es más pequeña queScale
(p.ejNUMBER(2, 5)
), esto significa 3 cosas:- El número no tendrá parte entera, sólo parte fraccionaria.Entonces, el 0 en la parte entera no se cuenta en los cálculos, se dice 0,12345, no 0,12345.De hecho, si especifica solo 1 dígito en la parte entera, siempre devolverá un error.
- El
Scale
representa el número total de dígitos en la parte fraccionaria que tendrá el número.5 en este caso.Por lo tanto, 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 por
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).Entonces 3 ceros + 2 números significativos = 5 que es el
Scale
número.
En resumen, cuando ves 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.
Aquí hay unos 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
Gracias a todos por las respuestas. Parece que la precisión es el número de dígitos significativos.
select cast(0.000123 as number(2,5)) from dual
resultados en:
.00012
Donde
select cast(0.00123 as number(2,5)) from dual
y
select cast(0.000999 as number(2,5)) from dual
tanto resultar en:
ORA-01438: value larger than specified precision allowed for this column
el segundo uno debido al redondeo.
Según la documentación de Oracle:
La escala puede ser mayor que la precisión, más comúnmente cuando se usa la notación e.Cuando la escala es mayor que la precisión, la precisión especifica el número máximo de dígitos significativos a la derecha del punto decimal.Por ejemplo, una columna definida como NÚMERO(4,5) requiere un cero para el primer dígito después del punto decimal y redondea todos los valores más allá del quinto dígito después del punto decimal.
Es una buena práctica especificar la escala y la precisión de una columna de números de punto fijo para realizar una verificación adicional de la integridad en la entrada.Especificar escala y precisión no fuerza todos los valores a una longitud fija.Si un valor excede la precisión, Oracle devuelve un error.Si un valor excede la escala, Oracle lo redondea.
El caso en el que la escala es mayor que la precisión se podría resumir de esta manera:
Número de dígitos a la derecha del punto decimal = Escala
Número mínimo de ceros a la derecha de decimal = Escala - Precision
--this will work
select cast(0.123456 as number(5,5)) from dual;
devuelve 0,12346
-- but this
select cast(0.123456 as number(2,5)) from dual;
--will return "ORA-1438 value too large".
--It will not return err with at least 5-2 = 3 zeroes:
select cast(0.000123456 as number(2,5)) from dual;
devuelve 0,00012
-- and of course this will work too
select cast(0.0000123456 as number(2,5)) from dual;
volver 0,00001
Hmm como entiendo la referencia de la precisión es el número de dígitos.
maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits
En oráculo que tiene tipo NUMBER (precisión, escala) donde la precisión es el número total de dígitos y la escala es el número de dígitos a la derecha del punto decimal. La escala puede ser omitido, pero significa cero. Precision puede ser no especificado (es decir, utilizar NÚMERO (*, 10)) - esto significa número total de dígitos es como se necesitaba, pero hay 10 dígitos de la derecha
Si la escala es menor que cero, el valor será redondeado a dos dígitos scale
izquierda del punto decimal.
Creo que si reserva más números a la derecha del punto decimal que no puede haber en toda la serie, esto significa algo así como ,00000000123456 pero no estoy 100% seguro.