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?

¿Fue útil?

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 que Scale (p.ej NUMBER(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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top