2009-07-06 11 views
5

Generalmente en la programación, los tipos de datos de coma flotante no se deben comparar por igualdad ya que los valores almacenados son a menudo una aproximación.Oracle NUMBER Comparaciones

¿Pueden dos valores de Oracle NUMBER no enteros compararse de manera confiable para la igualdad ya que se almacenan de manera diferente (base-10)?

Respuesta

5

Sí, los tipos de Oracle NUMBER son precisos. Son más como números enteros con una escala que tipos flotantes/dobles. Entonces un NÚMERO (10,3) tiene 10 dígitos, 3 después del punto decimal, que en realidad es un número entero de 10 dígitos con una escala de 3. De hecho, así es como funciona Java BigDecimals (es un BigInteger más una balanza internamente).

+0

¿Algún documento disponible? –

+0

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#i16209 – cletus

+0

No, no son precisos. – Quassnoi

2

Los tipos de Oracle NUMBER se almacenan como conjuntos de dígitos centesimales (es decir, base 100, no base 10), un dígito por byte.

El primer byte representa el exponente, otros bytes representan mantissa.

Eso significa que para un número extremadamente grande, incluso los números enteros se puede redondear:

SELECT 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 
     10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 
FROM dual 


--- 
0 
0

Oracle garantiza 38 dígitos de precisión en un número, aunque 40 puede ser representado. Ver Oracle Concepts para una referencia.