Bom Dia Pessoal,

Tenho aqui um problema clássico de soma e subtração, tanto pro JAVA, quanto 
pro Flex. Já vi casos até no Ruby. Vamos ao exemplo:

var x:Number = 10.03;
var y:Number = 0.07;
var z:Number = 9.9;

var total:Number = 0;
total += x;     //10.03
total += y;    //11.0000001
total += z;    //20.0000005

trace(total); // Total: [20.0000005] De onde surgiu o 0.0000005?

Este problema acontece com menor freqüência nas somas, ou seja, quando a 
operação é de Adição [ + ], agora vejamos o que acontece na subtração:
var x:Number = 20;
var y:Number = 10.07;
var z:Number = 9.93;

var total:Number = 0;
total = x;        //total = 20
total -= y;      //total = 9.93000001    De onde surgiu esse 0.00000001?  O 
correto seria 9.96
total -= z;      //total = -4.1000005     Esse é o resultado mais absurdo de 
todos os tempos. O correto seria zero.

Em JAVA resolvemos esta questão fácil fácil com a classe BigDecimal. Mas, e 
no Flex? Será que eu terei que criar uma classe BigDecimal só pra poder 
realizar contas de somar? Que furada.

Pior ainda é quando você precisa fazer comparações, exemplo:
Tenho o seguinte objeto:

Parcela {
    public var filial:String;
    public var porcentagem:Number;
}

Tenho uma ArrayCollection cheio de objetos do tipo Parcela. Neste exemplo 
nós temos uma Despesa que será dividida em várias parcelas, cada uma 
contendo uma porcentagem. No final teremos que verificar se a soma de todas 
as parcelas é igual a 100%.

var lista:ArrayCollection = new ArrayCollection();

var parcelaX:Parcela = new Parcela();
parcelaX.filial = "Filial X";
parcelaX.porcentagem = 20.93;
lista.addItem(parcelaX);

var parcelaY:Parcela = new Parcela();
parcelaY.filial = "Filial Y";
parcelaY.porcentagem = 49.07;
lista.addItem(parcelaY);

var parcelaZ:Parcela = new Parcela();
parcelaZ.filial = "Filial Z";
parcelaZ.porcentagem = 30;


var total:Number = 0;
for each ( var parcela:Parcela in lista ) {
    total = total + parcela.porcentagem;

    //Tanto faz o tipo de soma é por incrementação ou não
    //total += parcela.porcentagem
}

trace(total);        //Total: 100.000000049    (De onde surgiu esse infeliz 
desse 000000049?)

if ( total == 100 ) {
    trace("Parabéns, seu Flex aprendeu a somar");
} else {
    Alert.show("Somatório Tabajara", "Erro");
}


============================================================================================================
Resumo da história, como não sabemos resolver esse tipo de problema o jeito 
é ir se virando com soluções falhas como o caso do arredondamento em que eu 
converto pra String através do toFixed() e depois realizo um cast pra Number 
novamente. Agora imagine você ter que procurar em todos os trechos do 
programa códigos de soma pra fazer essa conversão, é um tiro no pé.

Number(total.toFixed(2));

Quando decidimos utilizar o Flex como solução para nossa empresa, estávamos 
pensando em algo que fosse profissional e confiável, uma linguagem de bases 
sólidas e maduras, e não mais uma linguagem de programador iniciante, que 
não se decidiu até hoje se usa JAVA, Ruby, PHP, entre outras. Nossos códigos 
possuei quase 50 milhões de linhas, já pensou o que é um problema de soma, 
quando o programa se trata de uma Folha de Pagamentos ou até mesmo um 
programa de Contabilidade ou Contas a Pagar.

Quer receber uns centavos a menos na sua folha de pagamento? Então, por 
favor nos ajudem a resolver esse problema.


Grande Abraço,
-Daniel Negri



--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para [EMAIL PROTECTED]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a