Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-02-2007
Meinard Meinard is offline
Registrado
 
Registrado: feb 2007
Posts: 3
Poder: 0
Meinard Va por buen camino
Redondeos extraños en Delphi con Currency y Firebird 2.0

Hola, mi problema es el siguiente, estoy desarrollando un punto de venta y manejo variables currency para los datos de tipo moneda en Delphi y Numeric(10,2) en Firebird, el detalle es el siguiente suponiendo que tengo un producto que cuesta $5.50 y le tengo que aumentar el 15% por concepto de algún impuesto, el resultado de sacarle el 15% sería $0.825, lo cual al yo mostrarlo en delphi en una etiqueta aplicando Código Delphi [-]FormatCurr('$#,##0.00', Valor)

o Código Delphi [-]CurrToStrF(Valor, ffCurrency, 2)

me da como resultado $0.82, pero al agregar esto a firebird con los componente IB que ya vienen en delphi asignando en la consulta "Insert" un parametro para los campos de moneda y asignandole al parametro el valor como AsCurrency, me guarda 0.83, he leido aqui en el foro que en teoria el utilizar currency y numeric en firebird me evitaria problemas de redondeo pero no es así, ya he intentado varias funciones para dar formato en delphi a los valores currency pero siguen redondeando a 0.82, empeze a utilizar RoundTo y si hubo una diferencia al sacar el total sumando el precio 5.5 + el impuesto seria 6.325 y aqui si me redondeo a 6.33 pero el puro impuesto me lo sigue marcando como 0.82. No entiendo bien la manera en que redondea delphi los currency pero me parece muy extraño que 0.825 lo deje como 0.82 y 6.325 como 6.33, me interesa que el 0.825 lo redondie correctamente 0.83 como lo hace al agregarlo a Firebird. En el peor de los casos aceptare que se redonde 0.82 pero siempre y cuando sea constante y todos los números los redondie igual como el 6.325 a 6.32 y en firebird se guarden igual a como los muestro en delphi. De antemano gracias por su atención y ayuda.
Responder Con Cita
  #2  
Antiguo 27-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Nuestro compañero Al González, nos habla de los tipos de redondeos en este hilo.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 27-02-2007
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
En muchas ocasiones me han sacado canas verdes los redondeos, pero lo solucione con la siguiente función:
Código Delphi [-]
//Valor = Valor a Readondear
//Dec  = Es la Posición de la decimal que redondeará
function Redondearagag(Valor:Real; Decimal:Integer):Real;
begin
  result := StrToFloat(FloatToStrF(StrToFloat(FloatToStr(Valor)), ffFixed, 18, Decimal));
end;

Saludos....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
  #4  
Antiguo 28-02-2007
Meinard Meinard is offline
Registrado
 
Registrado: feb 2007
Posts: 3
Poder: 0
Meinard Va por buen camino
Redondeos extraños en Delphi con Currency y Firebird 2.0

Ya revise el hilo que me sugeriste Lepe, pero no encontre solución a mi problema, ya tengo identificada de que manera redondea Firebird y para mi proposito es la adecuada, lo que no logro es hacer que Delphi responda de la misma manera, ó poder controlar de que manera quiero que Delphi aplique el redondeo.

Para que quede un poco más claro cual es mi problema me gustaría que probaran estas líneas de código:

Código Delphi [-]
var
  curTemp: Currency;
begin
  curTemp := 0.825;
  ShowMessage(CurrToStrF(RoundTo(curTemp, -2), ffCurrency, 2));
  curTemp := 0.825 + 1.5;
  ShowMessage(CurrToStrF(RoundTo(curTemp, -2), ffCurrency, 2));
  curTemp := 2.325 - 1.5;
  ShowMessage(CurrToStrF(RoundTo(curTemp, -2), ffCurrency, 2));
end;

  • El primer mensaje nos debería de mostrar un resultado de 0.82.
  • Tomando en cuenta la experiencia del primer mensaje, entonces sería logico pensar que mostraría 2.32, pero en este caso lo hace de manera distinta mostrando 2.33.
  • En el tercer mensaje vuelve a mostrar 0.82. Entonces depende de que número le guste a Delphi ya que si ponemos directamente 2.325 en la variable y ejecutamos nos dara de nuevo 2.33. Al principio sospechaba que tuviera que ver algo el hecho de la suma pero al parecer es culpa de un compilador racista.
Si alguien puede ayudarme a controlar la manera en que Delphi aplica redondeos se los agradecería mucho.

P. D. Trabajo con Delphi 7 y creo que tiene instalada una actualización (no recuerdo de que). Si alguien hace la prueba y no obtiene resultados extraños como los mios le agradecería que especificara con que version de Delphi trabaja, ya que tengo a la mano varias versiones distintas pero trabajo con la 7 ya que es la que me parece más comoda.
Responder Con Cita
  #5  
Antiguo 28-02-2007
TJose TJose is offline
Miembro
 
Registrado: may 2003
Posts: 162
Poder: 21
TJose Va por buen camino
Hola Meinard, foro

Si te sirve yo desarrolle una UDF, que me convierte a formato de moneda con redondeo a cero centavos y a cinco centavos.
Para la aplicacion que hice viene bien, no se para otras.
Al ser una udf todo se realiza en la base de datos.

por si no se entendió funciona así:

Código:
1.17 -> 1.15
1.18 -> 1.20
1.22 -> 1.20
1.23 -> 1.25
Si te sirve te la envío

Saludos
TJose
Responder Con Cita
  #6  
Antiguo 07-03-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Ya he se ha explicado muchas veces lo del decimales.

Les recuerdo que uan cosa es lo que esta en la base de datos y otra como s emuestra. Si un calculo te dio 1.23455 y mandas aguardar 1.3 es de suponer que en la bd tendras 1.3 asi que si quieres 1.23455 entonces guarda 1.23455.

Pero el problema nop es de bd si no de compnentes que cuando das formato viasual asi lo mandas a guandar asi(no todos los componentes) asi que guarda los datos completos con todos los decimales(18 si mas no recuerdo).
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #7  
Antiguo 07-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Empieza mirando la ayuda de RoundTo, allí dice que depende de SetRoundMode, que tiene estos posibles valores:
Cita:
Value Meaning
rmNearest
Rounds to the closest value.

rmDown
Rounds toward negative infinity.

rmUp
Rounds toward positive infinity.

rmTruncate
Truncates the value, rounding positive numbers down and negative numbers up.
Si ninguno te sirve, siempre puedes implementar tú la función que quieras.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Redondeos con Firebird 2.0 Jose_T Firebird e Interbase 12 19-01-2007 19:57:02
Currency to float david duarte Varios 2 14-11-2006 16:53:22
Problemas con Delphi, errores extraños Delphius Varios 18 02-06-2006 06:14:49
problemas con float y redondeos wonder boy Firebird e Interbase 17 27-12-2005 20:59:06
Problemas con Redondeos AGAG4 Varios 4 14-11-2005 23:38:44


La franja horaria es GMT +2. Ahora son las 10:42:12.


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
Copyright 1996-2007 Club Delphi