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:
-
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.
-
package com.saberprogramar.func
-
{
-
public class Calc
-
{
-
-
public static function multiplicar(fator1:Number, fator2:Number):Number{
-
-
var produto:Number;
-
-
produto = fator1 * fator2;
-
-
/**
-
* Agora usaremos um método para arrendondar valores para evitar o erro demostrado
-
* no blog e para manter o padrão de 2 casas decimais
-
**/
-
var produtoArredondado:String = produto.toFixed(2);
-
-
return new Number(produtoArredondado);
-
-
}
-
-
public static function dividir(dividendo:Number, divisor:Number):Number{
-
-
var quociente:Number;
-
-
quociente = dividendo / divisor;
-
-
/**
-
* Agora usaremos um método para arrendondar valores para evitar o erro demostrado
-
* no blog e para manter o padrão de 2 casas decimais
-
**/
-
var quocienteArredondado:String = quociente.toFixed(2);
-
-
return new Number(quocienteArredondado);
-
-
}
-
-
public static function somar(parcela1:Number, parcela2:Number):Number{
-
-
var soma:Number;
-
-
soma = parcela1 + parcela2;
-
-
/**
-
* usei na soma só por encargo de conciência
-
* e para manter o padrão de 2 casas decimais
-
**/
-
var somaArredondado:String = soma.toFixed(2);
-
-
return new Number(somaArredondado);
-
-
}
-
-
public static function subtrair(minuendo:Number, subtraendo:Number):Number{
-
-
var diferencaResto:Number;
-
-
diferencaResto = minuendo + subtraendo;
-
-
/**
-
* usei na subtração só por encargo de conciência
-
* e para manter o padrão de 2 casas decimais
-
**/
-
var diferencaRestoArredondado:String = diferencaResto.toFixed(2);
-
-
return new Number(diferencaRestoArredondado);
-
-
}
-
-
}
-
}
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!
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!!



