PDA

Ver la Versión Completa : Calculo con decimales


Carlos Arevalo
30-07-2008, 16:19:58
Que tal Amigos

El problema es el sig:

un cliente tiene hecho en excel un calculo para el iva de la siguiente manera.

Divide el monto total ya con el iva incluido 185 entre 1,09 = 169,72 y luego calcula el iva multiplicando por 9% y el resultado que da es 15,27522936 que al darle el formato para 2 decimales queda en 15,28.

El objetivo de esta funcion es intruducir el monto ya con iva y que la funcion separe la base del iva y de esta manera trabajar con montos redondos sin decimales.

Cuando yo hago este mismo calculo en Delphi el resultado del iva es 15,2748 al ponerle dos decimales me queda en 15,27.

Como puedo hacer para que el calculo me de como en la hoja de excel 15,2752 y al ponerle dos decimales de 15,28 cual es el error?


base.text:=formatfloat('#,##0.00',strtofloat(monto.Text)/((100+strtofloat(ivax.Text))/100));
ivamonto.Text:= formatfloat('#,##0.00',(strtofloat(base.text)* strtofloat(ivax.Text)) / 100);

Luis M.
30-07-2008, 16:47:46
Hola.

El calculo sería más o menos así:
Suponiendo:
Monto = 120€
Iva := 16 %

Base = 120 / 1.16 = 103.45 €

No se si era esto lo que buscabas.
Un saludo.

coso
30-07-2008, 17:09:21
Hola, a mi me ocurrio algo parecido con los descuentos: segun como lo calculaba, redondeaba para arriba o para abajo. El problema esta que extraes el dato desde el edit. Deberas guardarlo todo en variables double, haciendo los calculos paralelamente hasta el momento de mostrarlo. Dicho de otra manera, no deberias usar ivax.text, sino calcular este en un double, y solo usar cadenas cuando se quiera mostrar o modificar su valor directamente (claro esta, con la divison de arriba, total_con_iva / 1.09 = base)

Carlos Arevalo
30-07-2008, 18:12:27
Estas en lo correcto hice la prueba de esta manera y funciona bien.



var xbase,xmonto,xivax,xivamonto: double;
begin

xmonto:=0;
xivax:=0;

xmonto:=strtofloat(monto.Text);
xivax:=strtofloat(ivax.Text);

xbase:= xmonto/((100+xivax)/100);
xivamonto:= (xbase*xivax) / 100;

base.text:=formatfloat('#,##0.00',xbase);
ivamonto.Text:= formatfloat('#,##0.00',xivamonto);




Muchas gracias por la ayuda.