Olá,

Eu fiz o teste do primeiro trecho aqui e os resultados foram conforme
os comentários do código abaixo:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
        layout="vertical" initialize="initApp()">

        <mx:Script>
                <![CDATA[

                        private function initApp():void
                        {
                                var x:Number = 10.03;
                                var y:Number = 0.07;
                                var z:Number = 9.9;

                                var total:Number = 0;
                                total += x;    // resultado: 10.03
                                total += y;    // resultado: 10.1
                                total += z;    // resultado: 20

                                trace(total); // imprime: 20

                        }

                ]]>
        </mx:Script>

</mx:Application>

Estes resultados coincidiram com o mesmo teste no Excel trabalhando
com 6 casas decimais. Ou seja, eu não consegui enxergar o problema.

Por acaso você está com a versão do Flex mais atual incluindo os
"HotFixes"?

[]'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