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)
-   -   Redondeos extraños en Delphi con Currency y Firebird 2.0 (https://www.clubdelphi.com/foros/showthread.php?t=40785)

Meinard 26-02-2007 23:54:35

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.

Lepe 27-02-2007 13:49:30

Nuestro compañero Al González, nos habla de los tipos de redondeos en este hilo.

Saludos

AGAG4 27-02-2007 20:01:10

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....

Meinard 28-02-2007 01:53:51

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.

TJose 28-02-2007 02:45:07

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

rastafarey 07-03-2007 18:58:44

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).

Lepe 07-03-2007 21:36:30

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


La franja horaria es GMT +2. Ahora son las 09:35:52.

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