Consulta con mas de 4 decimales
Hola.
Tengo una consulta en Firebird 2.5 en la cual me trae el costo (12987.0000) el precio (15516.8676), al momento de dividirlos me retorna el valor de 1.1948 cuando necesito que me muestre 1.194829 la consulta la estoy realizando así:
Que puedo hacer, ya intente con un CAST( AS DECIMAL(4,6)), generando error -842. Gracias! |
Prueba :
select cast(precio as numeric(15,6)) / costo from producto Saludos |
Gracias guillotmarc, pero siguen apreciando solo 4 cifras después del punto. Alguna otra idea...
|
Hola.
El problema probablemente sea la representación que muestra tu programa Delphi, estará redondeando en el momento de mostrar. |
Hola, gracias por tu interés. la consulta la estoy realizando directamente en firebird utilizando la herramienta EMS Intebase Manager.
|
De que tipo de dato son los campos PRECIO y COSTO?
|
son decimal(18,4).
|
Hola.
Quizás sea la visualización del EMS Interbase Manager quien te redondea el resultado. Prueba esto, para confirmarlo : select cast(cast(precio as numeric(15,6)) / costo as varchar(50)) from producto Si el problema no está en un redondeo en los componentes de presentación en pantalla, entonces prueba de cambiar el tipo a todos los operandos (en principio solo debería ser necesario hacerlo en el primero) : select cast(precio as numeric(15,6)) / cast(costo as numeric(15,6)) from producto NOTA: Aunque lo acabo de probar en una base de datos Firebird 2.0, y a mi me funciona correctamente solo cambiando el tipo en el primer operando, tal y como te recomendé en el mensaje anterior. Así que aunque el EMS Interbase Manager te muestre solo 4 caracteres, en tu aplicación deberías poder mostrar correctamente los 6 caracteres que en realidad devuelve la consulta. Saludos. |
Creo que es ahí el detalle. Los campos no son de DOUBLE PRECISION. Necesitas convertir a DOUBLE PRECISION los campos COSTO y PRECIO al momento de hacer la consulta: Por ejemplo;
Puedes leer más al respecto en http://www.firebirdfaq.org/faq79/ Saludos, Chris |
Bueno aun nada, tratare de ser mas especifico.
La primera parte del select hace referencia al precio : (cast(costo as NUMERIC(15,6)) + cast((cast(costo as NUMERIC(15,6)) * (pcj_venta1/100)) as numeric(15,6))) La segunda al costo : cast(costo as NUMERIC(15,6)). El porcentaje de venta pcj_venta1 no es mas que una variable de tipo decimal(4,4). El resultado luego de realizar la consulta donde el costo es 12987 y precio es 15516.8876 es el siguiente... 1.1284. Ahora el por que. requiero hacer esto... bueno sucede que el cliente el margen de utilidad esta dado por ((precio/costo)-1))*100 donde reemplazando me dará una utilidad de 12.8449, pues bien, ahora el cliente compro no a 12987 sino a 11000 pero se requiere que el precio de venta se mantenga por lo tanto calculo el precio actual y lo divido entre el nuevo costo para actualizar el margen de utilidad en la tabla. Espero quizás me entiendan el porque de la necesidad de los decimales ya que con solo los cuatro del resultado 1.1284 al restarle 1 y multiplicarlo por 100 me da 12.84 donde el precio se vera afectado... como enrredado cierto! :D |
Prueba con lo que te dijo Chris (double precision)
|
Efectivamente... gracias a todos. Ya funciono la cuestión estaba en hacerle cast a pcj_venta1 era lo único y listo.. claro esta utilice el double precisión. Por ultimo habrá mucha diferencia en utilizar double precision y decimal o numeric?
|
Resp
No creo que deba hacer ningun cast. Pero eso es el resultado de la division. El manejador es tan inteligente que expande la cantidad de decimales tanto numerador como denominador. Osea 8 decinames.
El resultado de la division es 11948. No entendo como quieres que te de mas decimales si eso es lo que da lo he probado con varias calculadoras y no me da diferente. |
Cita:
Pruébalo. NOTA : ¿ Que crees que haría el motor de Firebird si el resultado de una operación es un número irracional ?, ¿ devolvernos un nº infinito de decimales ?. |
Lo probare, muchas gracias a todos
|
resp
Por que lo prove es que lo digo
|
Si, tienes razón, disculpa.
Lo acabo de probar, y en efecto, Firebird ya devuelve siempre un valor correcto con 8 decimales. El valor que devolvía Firebird en la pregunta original ya era el valor correcto de verdad, y no el valor que equivocadamente estaba esperando el usuario. Todas las respuestas que se han dado han sido correctas en todo momento, pero innecesarias. Como bien dices, en esta ocasión no hay ninguna necesidad de forzar los tipos de datos. |
La franja horaria es GMT +2. Ahora son las 04:01:19. |
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