Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Error mio o bug de Firebird? (https://www.clubdelphi.com/foros/showthread.php?t=20519)

TJose 18-04-2005 13:24:39

Error mio o bug de Firebird?
 
Hola Foro

Utilizo FB 1.5.2 en este caso en Windows 2000
Esto que sucede es muy extraño, dado que en otras bases tengo operaciones parecidas y se comportan como corresponde. Paso a detallar:

en un procedimiento
...
declare variable vX numeric(9,2);
...
vX = 1 - 50/100;
...

el vX deberia tomar como valor 0.5, sin embargo siempre guarda 1.
Probe con parentesis, 1 - (50/100), cambie de numeric(9,2) a numeric(9,4) y es lo mismo.

Lo extraño, como mencione arriba, es que en otros procedimientos y funciones mas complejas siempre se comporta correcatamente FB.

Saludos
TJose

johncook 18-04-2005 15:07:06

Hola:
Estuve probando lo mismo en sql server y tengo el mismo problema.
Esto es lo que encontré en la ayuda:

Si un dividendo de tipo entero se divide por un divisor de tipo entero, el resultado es un entero en el que se trunca la parte fraccionaria del resultado, si hubiera.

Creo que la solución por el momento es que hagas lo siguiente : vx=50*0.01
Si alguien conoce una mejor manera de realizarlo (utilizando operador de división o alguna palabra reservada), por favor postee asi nos sacamos la duda.
Gracias.

TJose 18-04-2005 15:21:29

Gracias johncook

Como bien dices, cambiando la ecuacion se soluciona, pero que peligroso puede ser confiarse en que la ecucion esta bien planteada y no controlar los resultados.

Saludos
TJose

Rufus 18-04-2005 15:29:17

jhoncook, tienes razon. En isql, ejecutando esto:
Código SQL [-]
select 50/100 from rdb$database;
el resultado es 0. Al ser ambos operandos integer, el resultado tambien será integer.

Ahora bien, si introducimos:
Código SQL [-]
select 50.00/100 from rdb$database;
select (50 + 0.00) /100 from rdb$database;
select (50 * 1.00) /100 from rdb$database;
sí nos devuelve 0.50, el resultado correcto, al ser uno de los operandos con dos decimales el resultado tambien nos lo devuelve con dos decimales.

Un saludo


La franja horaria es GMT +2. Ahora son las 01:53:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi