Opa, este exemplo criado, vou pegar um exemplo concreto e mando...
----- Original Message ----- From: "Henrique" <[EMAIL PROTECTED]> To: <[email protected]> Sent: Wednesday, November 14, 2007 11:30 AM Subject: [flexdev] RES: [flexdev] Re: O Flex não sabe somar!? Matemática Básica 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 -~----------~----~----~----~------~----~------~--~---
