problema com média ponderada

Delphi

18/12/2006

olá pessoal,

alguém utiliza média ponderada em algum sistema? tem hora q o cálculo apresenta um valores ´complicados´ mas o cálculo matemático esta correto, por exemplo na imagem...

[url=http://www.mh2img.net][img:79ba0b1b42]http://img00.mh2img.net/14MediaPond.JPG[/img:79ba0b1b42][/url]

alguém tem alguma sugestão, idéia de como resolver isso da melhor maneira possível?


Gilberto Fernandes

Gilberto Fernandes

Curtidas 0

Respostas

Marco Salles

Marco Salles

18/12/2006

mas o cálculo matemático esta correto, por exemplo na imagem...


[b:fe4aba99f2]o calculo esta correto.. com exceção de problemas de arredondamento, mas isto ja não faz parte da matamética e sim da informatica[/b:fe4aba99f2]

alguém tem alguma sugestão, idéia de como resolver isso da melhor maneira possível?

resolver o que ???


GOSTEI 0
Gilberto Fernandes

Gilberto Fernandes

18/12/2006

a quantidade final esta zero, mas o valor em estoque do produto esta -0,10, esse é o problema!

e apesar de na imagem esta aparecendo apenas duas casas de centavos os calculos foram realizados com seis casa


GOSTEI 0
Marco Salles

Marco Salles

18/12/2006

para resolver o problema , e esquecer dos arredonamentos , voce deve dividir o problema em duas etapas...


1)
[b:409461d4f9]No caso de entrada de mercadoria[/b:409461d4f9]


Para calcular o preço medio < ai que entra a media ponderada no calculo > voce faz assim

ValorUnitario = Quant1*ValorUnitario1 + Quant2*ValorUnitario2 /(Quantidade1+Quant2)


e

Valor=(QuantidadeTotal*ValorUnitario)


No seu exemplo , voce tem

Quant1=2000 ValorUnitario1 = 0,51 ... ai entrou
Quant2 = 1000 e ValorUnitario2 = 0,08

Logo faça:

ValorUnitario=2000*0,52+1000*0,08/(2000+1000)

ValorUnitario=0,36666 e finalmente

Valor=0,3666*3000 = 1099,99

[b:409461d4f9]Observe que o seu valorUnitario esta nesse momento[color=red:409461d4f9] 0,37 [/color:409461d4f9], quando o correto seria [color=red:409461d4f9]0,3666[/color:409461d4f9] e o seu valor quando entrou 1000 a um preco de 0,08 esta [color=red:409461d4f9]1096,40[/color:409461d4f9], quando o correto seria [color=red:409461d4f9]1099,99[/color:409461d4f9][/b:409461d4f9]
[b:409461d4f9]2)No caso de saida[/b:409461d4f9]

Mas independentemente desse arredondamentos , no caso de [b:409461d4f9]saida[/b:409461d4f9] voce deve calcular o valor , multiplicando a quantidade pelo Valor_Unitario...

No final , voce tera um saldo de zero e um valor_Unitario=0,3666 , porem o seu valor será zero


GOSTEI 0
Gilberto Fernandes

Gilberto Fernandes

18/12/2006

Marco, apesar do relatório esta aparecendo somente duas casas decimais esta calculando com 4 casas...

então no ponto q vc citou eu tenho 2000 a 0,51 = 1020,00, entrou mais 1000 a 0,07640 = 76,40, dando um total qtde = 3000 e valor = 1096,40

o valor calculado para a proxima saída é [color=red:60e07771f8]1096,40/3000 = 0,3655[/color:60e07771f8]

esse é o valor q esta calculando nas saídas posteriores
150 * 0,3655 = 54,825
2000 * 0,3655 = 731,00
850 * 0,3655 = 310,675

a soma das saídas da 1096,50 - 1096,40 = -0,10

o problema esta q eu achando o valor de 0,3655 depois da entrada, o arredondamento dessa dizima q da o problema pq [color=red:60e07771f8]1096,40 / 3000 = 0,3655[/color:60e07771f8], porém [color=red:60e07771f8]0,3655 * 3000 = 1096,50[/color:60e07771f8]


GOSTEI 0
Marco Salles

Marco Salles

18/12/2006

então no ponto q vc citou eu tenho 2000 a 0,51 = 1020,00, entrou mais 1000 a 0,07640 = 76,40, dando um total qtde = 3000 e valor = 1096,40 o valor calculado para a proxima saída é 1096,40/3000 = 0,3655


[b:68f3611777]eita..........[/b:68f3611777]

isto não é media ponderada amigo


GOSTEI 0
Gilberto Fernandes

Gilberto Fernandes

18/12/2006

não entendi, só demonstrei o calculo do jeito q vc fez, explicando q apesar de demonstrar 2 casas decimais o calculo esta sendo feito com 4 casas...

o q não é média ponderada???


GOSTEI 0
Massuda

Massuda

18/12/2006

Esse problema ocorre por causa do arredondamento forçado que você está usando (´o calculo esta sendo feito com 4 casas...´). Por exemplo, este código dá ´errado´:
var
  Total: Currency; // internamente arredonda 4 casas
  Media: Currency;
  Resto: Currency;
begin
  Total := 2000 * 0.51 + 1000 * 0.07640;
  Media := Total / 3000;
  Resto := Total - 3000 * Media; // Resto = -0.1 !!!
...
Se usar Double ao invés de Currency o cálculo fica OK.

O problema não é o Currency, mas sim o fato dos cálculos envolverem valores ´muito grandes´ e ´muito pequenos´ (milhares de unidades e centavos de dinheiro). Pelo que me lembro, tem técnicas matemáticas sofisticadas para contornar esse problema (que não valem a pena usar num controle de estoque) ou simplesmente use mais precisão no cálculo (por exemplo, mudar de Currency para Double).


GOSTEI 0
Gilberto Fernandes

Gilberto Fernandes

18/12/2006

vou tentar utilizar o Double nos calculos então, pra ver se modifica alguma coisa

Valeu Massuda


GOSTEI 0
POSTAR