Por favor, Daniel, confirme para nós a existência do problema porque
isso é no mínimo intrigante. Acho que o seu post merece bastante
atenção, pois eu nunca vi ninguém na lista criticar o Flex com tanta
veemência. Você deve ter bons motivos para isso e a sua contribuição
pode ser esclarecedora para a comunidade.

[]'s
Beck Novaes


On 14 nov, 08:58, Tião da Obra <[EMAIL PROTECTED]> wrote:
> 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