Calculo em flex corretamente

estava desenvolvendo um sistema de PCP(Planejamento e Controle de Produção) em Flex e me deparei com algo interessante, quando mandava multiplicar um determindo valor pelo outro o flex me dava um valor um tanto quanto esquisito, então procurei no google e percebi que não fui o único e ter esse desagradável bug, vamos replicar o que acontece:

ACTIONSCRIPT:
  1. 12 * 0.95 = 11.399999999999999 // o certo é 11.40

loucura não, então pesquisando uma solução encontrei essa aqui.

achei legal mais quer saber, resolvi então criar minha própria função para fazer os meus cálculos de forma correta, então vamos mostrar o código fonte e explicar o que fizemos

Nossa Classe Func.as -> crie a classe na sua biblioteca ou no seu folder de funções.

ACTIONSCRIPT:
  1. package com.saberprogramar.func
  2. {
  3. public class Calc
  4. {
  5.  
  6. public static function multiplicar(fator1:Number, fator2:Number):Number{
  7.  
  8. var produto:Number;
  9.  
  10. produto = fator1 * fator2;
  11.  
  12. /**
  13. * Agora usaremos um método para arrendondar valores para evitar o erro demostrado
  14. * no blog e para manter o padrão de 2 casas decimais
  15. **/
  16. var produtoArredondado:String = produto.toFixed(2);
  17.  
  18. return new Number(produtoArredondado);
  19.  
  20. }
  21.  
  22. public static function dividir(dividendo:Number, divisor:Number):Number{
  23.  
  24. var quociente:Number;
  25.  
  26. quociente = dividendo / divisor;
  27.  
  28. /**
  29. * Agora usaremos um método para arrendondar valores para evitar o erro demostrado
  30. * no blog e para manter o padrão de 2 casas decimais
  31. **/
  32. var quocienteArredondado:String = quociente.toFixed(2);
  33.  
  34. return new Number(quocienteArredondado);
  35.  
  36. }
  37.  
  38. public static function somar(parcela1:Number, parcela2:Number):Number{
  39.  
  40. var soma:Number;
  41.  
  42. soma = parcela1 + parcela2;
  43.  
  44. /**
  45. * usei na soma só por encargo de conciência
  46. * e para manter o padrão de 2 casas decimais
  47. **/
  48. var somaArredondado:String = soma.toFixed(2);
  49.  
  50. return new Number(somaArredondado);
  51.  
  52. }
  53.  
  54. public static function subtrair(minuendo:Number, subtraendo:Number):Number{
  55.  
  56. var diferencaResto:Number;
  57.  
  58. diferencaResto = minuendo + subtraendo;
  59.  
  60. /**
  61. * usei na subtração só por encargo de conciência
  62. * e para manter o padrão de 2 casas decimais
  63. **/
  64. var diferencaRestoArredondado:String = diferencaResto.toFixed(2);
  65.  
  66. return new Number(diferencaRestoArredondado);
  67.  
  68. }
  69.  
  70. }
  71. }

Vou explicar o porque criei esta classe da forma que criei, primeiro todos os métodos (Function) são public e static, que dizer que vamos poder usar nossos métodos sem precisar instanciar esta classe, outro fator e o mais importante é que quando precisarmos calcular percentual, ou a raiz quadrada, ou criar um cálculo de média vamos criar neste classe, sempre seguindo o mesmo padrão, e para terminar preste atenção na única coisa de diferente que esse código tem a variável Number chamando um método nativo do NUmber chamado de .toFixed(2), isso quer dizer que estamos pedindo para o action script arredondar o nosso valor com 2 casas decimais.

CUIDADO!

use métodos static apenas em funções genéricas, que vai ser usado por muitas classes como é o nosso caso, quando o método é especifico de uma classe não use static. Tem um exemplo muito bom explicando quando usar e não usar static, é em java mais dá para entender o conceito em qualquer linguagem, ok! icon wink Calculo em flex corretamente

http://www.guj.com.br/java.artigo.121.1.guj

um exemplo do uso da nossa função

para ver o código fonte -> botão direito do mouse -> view source.

Espero ter ajudado e bons Estudos.

Vlw!!

{lang: 'pt-BR'}

You can leave a response, or trackback from your own site.
  • http://www.sobreflex.com Marcos Arno Prediger

    Excelente cara, estava eu aqui quebrando a cabeça para permitir apenas duas casas decimais após a vírgula e sua classe simplesmente salvou uma parte muito importante do meu tc.

    Muito Obrigado
    Marcos Arno Prediger

  • Marcos Arno Prediger

    Olá, eu estava implementando a classe no meu tc e surgiu um problema, eu preciso calcular um valor em reais, se este calculo não for inteiro ele me trará os resultados com 1 ou 2 dígitos após o ponto e se for uma soma de 2 valores inteiros ele simplesmente elimina o numero 0 dos centavos que estão após o ponto. Ex 250.00 + 100.00 = 350 quando teria que retornar 350.00

    Você sabe como aplicar o .00 neste caso?

    • http://saberprogramar.com/blog/ janderson

      olá Marcos, tudo que vc precisa é pesquisar e apredender a usar o CurrencyFormat, no seu caso vai um simples exemplo ;)

      var currency:CurrencyFormatter = new CurrencyFormatter();
      currency.precision=2;
      var numero:String = currency.format(valorSeus350);

      espero que ajude..só um detalhe...nesse formato ".00" NÃO é em reais, em reais ",00" estudando o currencyFormat vc vai ver que é fácil converter blz...

      Cumps

  • Marcos Arno Prediger

    Muito obrigado, funcionou perfeitamente. Fiz algumas alterações na sua classe para adaptar ao meu projeto e ficou muito bom.

    Abraços

  • Diego

    Cara muito obrigado, já ia apelar também e desenolver algo, más ai pensei vamos ao google, alguém concerteza já deve ter passado com isto, hehe. valew mesmo.

Subscribe to RSS Feed Follow me on Twitter!