Caro Tião da Obra,

Copiei e colei o seu código no flex (que vc passou no post) conforme segue
abaixo:

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

        <mx:Script>
                <![CDATA[
                        import mx.collections.ArrayCollection;
                        
                        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;     //10.03
                                trace(total);
                                
                                total += y;    //11.0000001
                                trace(total);
                                
                                total += z;    //20.0000005
                                trace(total); // Total: [20.0000005] De onde
surgiu o 0.0000005?

                                var x1:Number = 20;
                                var y1:Number = 10.07;
                                var z1:Number = 9.93;

                                var total1:Number = 0;
                                total1 = x1;        //total = 20
                                trace(total1);
                                
                                total1 -= y1;      //total = 9.93000001
De onde surgiu esse 0.00000001?  O correto seria 9.96
                                trace(total1);

                                total1 -= z1;      //total = -4.1000005
Esse é o resultado mais absurdo de todos os tempos. O correto seria zero.
                                trace(total1);


                                //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:

                                //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:Object = new Object();
                                parcelaX.filial = "Filial X";
                                parcelaX.porcentagem = 20.93;
                                lista.addItem(parcelaX);
                                
                                var parcelaY:Object = new Object();
                                parcelaY.filial = "Filial Y";
                                parcelaY.porcentagem = 49.07;
                                lista.addItem(parcelaY);
                                
                                var parcelaZ:Object = new Object();
                                parcelaZ.filial = "Filial Z";
                                parcelaZ.porcentagem = 30;
                                lista.addItem(parcelaZ);
                                
                                var total3:Number = 0;
                                for each ( var parcela:Object in lista ) {
                                    total3 = total3 + parcela.porcentagem;
                                
                                    //Tanto faz o tipo de soma é por
incrementação ou não
                                    //total += parcela.porcentagem
                                }
                                
                                trace(total3);        //Total: 100.000000049
(De onde surgiu esse infeliz desse 000000049?)
                                
                                if ( total3 == 100 ) {
                                    trace("Parabéns, seu Flex aprendeu a
somar"); 
                                } 
                                else 
                                {
                                    trace("Somatório Tabajara", "Erro"); 
                                }
                        }
                ]]>
        </mx:Script>
</mx:Application>

Executei o código e o resultado do trace foi:

10.03
10.1
20
20
9.93
0
100
Parabéns, seu Flex aprendeu a somar

Ou seja, pra mim Tb esta correto!. 

Ahhh, tomei a liberdade de adicionar a linha 
        lista.addItem(parcelaZ);
que vc se esqueceu de colocar para poder dar o resultado esperado, ou seja
100!

[]s,

Henrique F. Marino

-----Mensagem original-----
De: [email protected] [mailto:[EMAIL PROTECTED] Em nome de
Beck Novaes
Enviada em: quarta-feira, 14 de novembro de 2007 11:19
Para: flexdev
Assunto: [flexdev] Re: O Flex não sabe somar!? Matemática Básica


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