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 -~----------~----~----~----~------~----~------~--~---
